圖片上傳安全性問題,根據ContentType (MIME) 判斷其實不許確、不安全

圖片上傳經常使用的類型判斷方法有這麼幾種---截取擴展名、獲取文件ContentType (MIME) 、讀取byte來判斷(這個什麼叫法來着?)。前兩種都有安全問題。容易被上傳不安全的文件,如木馬什麼的。第1種截取文件擴展名來判斷的方法很明顯不安 全,第2種ContentType MIME能夠僞造,因此用ContentType來判斷其實也不安全。建議採用第3種。安全

C#演示:測試

1.截取擴展名來作判斷,不可取。spa

if (Request.Files.Count > 0)
{
    //這裏只測試上傳第一張圖片file[0]
    HttpPostedFile file0 = Request.Files[0];
    string ext = file0.FileName.Substring(file0.FileName.LastIndexOf('.') + 1);//文件擴展名
    string[] fileTypeStr = { "jpg", "gif", "bmp", "png" };
    if (fileTypeStr.Contains(ext))
    {
        file0.SaveAs(Server.MapPath("~/" + file0.FileName));//保存文件
    }
    else
    {
        Response.Write("圖片格式不正確" + ext);
    }
}

2.判斷ContentType (MIME) ,比第1種方案安全。但其實ContentType是可僞造的,因此也不夠安全。code

if (Request.Files.Count > 0)
{
//這裏只測試上傳第一張圖片file[0]
    HttpPostedFile file0 = Request.Files[0];
    string contentType = file0.ContentType;//文件類型
string[] fileTypeStr = { "image/gif","image/x-png","image/pjpeg","image/jpeg","image/bmp"};
    if (fileTypeStr.Contains(contentType))
    {
        file0.SaveAs(Server.MapPath("~/" + file0.FileName));
    }
    else
    {
        Response.Write("圖片格式不正確" + contentType);
    }
}

3.經過byte獲取文件類型,來作判斷。blog

if (Request.Files.Count > 0)
{
//這裏只測試上傳第一張圖片file[0]
    HttpPostedFile file0 = Request.Files[0];
      
    //轉換成byte,讀取圖片MIME類型
    Stream stream;
    //int contentLength = file0.ContentLength; //文件長度
    byte[] fileByte = new byte[2];//contentLength,這裏咱們只讀取文件長度的前兩位用於判斷就行了,這樣速度比較快,剩下的也用不到。
    stream = file0.InputStream;
    stream.Read(fileByte, 0, 2);//contentLength,仍是取前兩位
    stream.Close();
      
    string fileFlag = "";
    if (fileByte != null && fileByte.Length > 0)//圖片數據是否爲空
    {
        fileFlag = fileByte[0].ToString() + fileByte[1].ToString();                  
    }
    string[] fileTypeStr = { "255216", "7173", "6677", "13780" };//對應的圖片格式jpg,gif,bmp,png
    if (fileTypeStr.Contains(fileFlag))
    {
        file0.SaveAs(Server.MapPath("~/" + file0.FileName));
    }
    else
    {
        Response.Write("圖片格式不正確:" + fileFlag);
    }
}
相關文章
相關標籤/搜索