【翻譯】C# 使用Image Guid 驗證圖片類型


引言

通常我們會看到任何的web站點都有上傳圖片和存儲圖片到服務器的功能。但是在存儲圖片之前有必要去驗證那些圖片,因為有可能被上傳惡意腳本。

通常我們會檢查上傳文件的擴展名從而拒絕那些腳本文件上傳到服務器上。但是這樣的驗證還不足以防止上傳惡意腳本,因為用戶會修改文件擴展名再上傳文件。

為了解決這個問題,我們需要檢查圖片的內容替代檢查擴展名。因為如果用戶修改文件擴展名,內容並沒有變化。

正文

在本文中我們將看到如何檢查圖片內容來防止用戶上傳惡意腳本。為了檢查圖片的內容我們將會使用到System.Drawing.Image 類。

第一步:使用Visual Studio 創建一個簡單的web站點並添加一個頁面。

在頁面中添加1個file upload,1個按鈕,1個lable

<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label>
<br />
<asp:Button Text="Save" runat="server" ID="butSave" OnClick="butSave_Click" />

第二步:在butsave_click中添加以下代碼來驗證圖片

try
{
if (FileUpload1.HasFile)
{
System.Drawing.Image image = System.Drawing.Image.FromStream(FileUpload1.FileContent);
string FormetType = string.Empty;
if (image.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Tiff.Guid)
FormetType = "TIFF";
else if (image.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Gif.Guid)
FormetType = "GIF";
else if (image.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Jpeg.Guid)
FormetType = "JPG";
else if (image.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Bmp.Guid)
FormetType = "BMP";
else if (image.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Png.Guid)
FormetType = "PNG";
else if (image.RawFormat.Guid == System.Drawing.Imaging.ImageFormat.Icon.Guid)
FormetType = "ICO";
else
throw new System.ArgumentException("Invalid File Type");

lblMessage.Text = "File Formet Is:" + FormetType;
}
}
catch (System.ArgumentException exp)
{
lblMessage.Text = "Invalid File";
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;

}

上面的代碼我們能驗證用戶上傳的任何文件,如果正確我們能將文件轉為圖片對象。在轉化為圖片對象后,我們就通過RawFormat.GUID去驗證文件內容。

使用這個方法只允許指定的一些圖片文件被通過。如果用戶修改文件的擴展名但是它們的RowFormat GUID是不會變化的。舉例,如果用戶把擴展名gif修改為jpg,但是它的GUID一直都沒有變化,它還會保持原先的GIF。

上面的例子,如果用戶上傳任何除了圖片的文件,在格式轉化時程序會拋出ArgumentException異常。所以我們不允許上傳任何文件除了圖片。

結尾

本文只是向你展示我們在驗證圖片的時候,使用內容驗證比擴展名更好。希望本文對你有用。


免責聲明!

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



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