.Net C# 判斷圖片 原始附檔名 .Net C# 判斷圖片 原始附檔名
  .NET       ez      2016-11-06

副檔名(Filename Extension,或作延伸檔名、字尾名)用來標誌檔案格式的一種機制。例如「example.txt」的檔案,example是主檔名,txt為副檔名,表示這個檔案是一個純文字檔案,句號「.」就是主檔名與副檔名的分隔符號。

以上就是什麼是附檔名,相信如果你是看這篇的人,因該早就知道了。

 

當您提供一個圖片上傳服務,如果沒有檢查圖片的真偽,就有可能造成漏洞。

通常工程師會限制副檔名,但如果圖片夾帶PHP,駭客就可以利用此方式攻擊你的伺服器。(本篇不探討此攻擊方式)

 

假如您的伺服器限制只能上傳 JPG,但用戶天真的將 BMP 改為 JPG,此種方式就可逃避偵測,如果直接將檔案儲存到伺服器,就會造成容量、流量爆增。

最簡單的解決方法,就是使用程式將圖片讀取出來,並且重新儲存即可。

此方法雖然可行,但會造成多餘的資料處理量。

 

每種圖片格式都有特定的檔案標頭,利用此方式偵測檔案格式,如下:

JPG 檔案:開頭 Byte 為 FF D8

BMP 檔案:開頭 Byte 為 42 4D

GIF 檔案:開頭 Byte 為 47 49 46

PNG 檔案:開頭 Byte 為 89 50 4E 47 0D 0A 1A 0A

 

程式碼如下:

 Dictionary<string, string> ImageTypes = new Dictionary<string, string>() { { "FFD8", ".jpg" }, { "424D", ".bmp" }, { "474946", ".gif" }, { "89504E470D0A1A0A", ".png" } };
 string builtHex = string.Empty;
 using (Stream S = File.OpenRead(圖檔路徑))
 {
     for (int i = 0; i < 8; i++)
     {
         builtHex += S.ReadByte().ToString("X2");
         if (ImageTypes.ContainsKey(builtHex))
         {
             string 真實副檔名 = ImageTypes[builtHex];
             break;
         }
     }
 }

此方式就可以快速偵測原始檔案類型。


標籤:   .NET

我要留言