【翻译】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异常。所以我们不允许上传任何文件除了图片。

结尾

本文只是向你展示我们在验证图片的时候,使用内容验证比扩展名更好。希望本文对你有用。

原文地址:https://www.cnblogs.com/zhxhdean/p/2563599.html