ASP.NET中上傳圖片檢測其是否為真實的圖片 防范病毒上傳至服務器


一、需求

我們在用.net開發網站時,經常會用到圖片上傳,可以說是每個網站必備的,大到門戶網站,電商網站,政務系統,OA系統,小到企業網站,個人網站,博客網站,導航網站等等,都有用到圖片上傳,那么在客戶端瀏覽器中上傳圖片,不可避免有些不法分子將病毒偽裝圖片文件,然后上傳到我們的網站服務器,這樣造成網站崩潰。為了解決這個問題,我們在程序中先過濾,就有了接下來的文章。

二、主要代碼

1、MVC中

我們就來上傳一個頭像,在MVC中怎么實現文件上傳,請查看我的文章:【MVC系列】ASP.NET MVC中如何實現文件上傳 FileUpLoad

       /// <summary>
       /// 上傳頭像
        /// </summary>
       /// <param name="userId">用戶編號</param>
       /// <returns>Json(-1表示系統異常,-2表示文件不合法)</returns>
        [HttpPost] 
        public JsonResult Upload(string userId)
        {
            //上傳頭像的路徑
            string folderPath = "/upload/avatar/";
            //判斷路徑是否存在
            if (!Directory.Exists(folderPath))
                Directory.CreateDirectory(folderPath);//創建文件路徑
            HttpPostedFileBase uploadFile = Request.Files["avatars"];
            if (uploadFile != null)
            {
                string oriFileName = uploadFile.FileName;//原始文件名
                string fileName = userId + "_" + oriFileName;//文件名的格式:用戶Id+文件名
                uploadFile.SaveAs(Server.MapPath(folderPath + fileName));//保存到服務器
                FileStream fs = new FileStream(Server.MapPath(folderPath + fileName), FileMode.Open, FileAccess.Read);
                BinaryReader reader = new BinaryReader(fs);
                string fileClass;
                byte buffer;
                byte[] b = new byte[2];
                buffer = reader.ReadByte();
                b[0] = buffer;
                fileClass = buffer.ToString();
                buffer = reader.ReadByte();
                b[1] = buffer;
                fileClass += buffer.ToString();
                reader.Close();
                fs.Close();
                if (fileClass == "255216" || fileClass == "7173" || fileClass == "6677" || fileClass == "13780")
                {
                    //255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar 
                    //Response.Write("圖片可用"); 
                    //保存到數據庫中
                }
                else
                {
                   
                    //Response.Write("圖片非法"); 
                    FileInfo f = new FileInfo(Server.MapPath(folderPath + fileName));
                    f.Delete(); //刪除文件
                    return Json(-2, JsonRequestBehavior.AllowGet);
                }
                return Json(Server.HtmlEncode(folderPath + fileName), JsonRequestBehavior.AllowGet);
            }
            return Json(-1, JsonRequestBehavior.AllowGet);

        }

2、WebForm中

public void UploadFile() {
            try {
                HttpPostedFile postfile = Request.Files["file"];
                string savepath = Server.MapPath("/upload/avatar/" + postfile.FileName);
                postfile.SaveAs(savepath);
                FileStream fs = new FileStream(savepath, FileMode.Open, FileAccess.Read);
                BinaryReader reader = new BinaryReader(fs);
                string fileClass;
                byte buffer;
                byte[] b = new byte[2];
                buffer = reader.ReadByte();
                b[0] = buffer;
                fileClass = buffer.ToString();
                buffer = reader.ReadByte();
                b[1] = buffer;
                fileClass += buffer.ToString();
                reader.Close();
                fs.Close(); 
                if (fileClass == "255216" || fileClass == "7173" || fileClass == "6677" || fileClass == "13780") {
                    //255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar 
                    //Response.Write("圖片可用"); 
                    //保存到數據庫中
                }
                else {
                    //Response.Write("圖片非法"); 
                    File.Delete(savepath); //刪除文件
                    return;
                }
            }
            catch (Exception) { //Response.Write("圖片非法!"); 
                return;
                throw;
            }
        }

三、總結

當然,這個只是防范病毒的一個很小的舉措,技術不深奧,當然我這里寫的過濾有個很大的缺陷,是先把文件上傳上服務器,然后再檢測,這樣也不安全,可以在上傳之前先檢測,大家自己去實現哈。當然,上傳文件要保證服務器的安全還有很多需要做的,比如在服務器中安裝殺毒軟件定時監測新增文件。還有硬件防火牆很多,在這里不再闡述。

在本章中如果在MVC中文件上傳無從下手的同學,可以學習到文件上傳,源碼中采用swfupload上傳,它可以支持多文件上傳。具體實現請在文章末尾下載源代碼。給大家布置一個作業,作進一步思考,怎么實現跨域或分布式上傳文件。(作業的需求:網站文件服務器與Web服務器分離,用戶上傳文件的時候,我們把文件存取到文件服務器中,如果文件服務器磁盤已滿,該作怎么處理?當然還有如果多用戶同時上傳文件,對磁盤寫入,我們服務器配置無法滿足現有的並發寫入,我們需要考慮多文件服務器,多文件服務器,那么我們在上傳文件又該做怎么處理呢?這里就涉及負載均衡和分布式)

大家有想法勇敢拍磚,歡迎拍磚,作業中的思考大家可以在評論中發表自己的看法。如果喜歡文章就頂我,也可以關注Me

結尾:這篇文章之前是發表在我的CSDN博客上的,把它移步到博客園來。CSDN的文章鏈接地址http://blog.csdn.net/naoguazi/article/details/8786400

最后附上全文件的源碼:

MVC 版

Webform版比較簡單就不上傳了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM