对上传的图⽚进⾏格式校验以及安全性校验对上传的图⽚进⾏格式校验以及安全性校验图⽚上传服务器后,需要对其进⾏安全校验
判断上传的是否是图⽚
通过后缀名进⾏判断
最基本的校验:校验⽂件的后缀名是否符合要求的格式。
这种⾮常的不靠谱,完全可以修改⽂件的后缀名绕过检验。
public static bool CheckUpLoadFileExtension(string fileName)
{
string fileExtension = System.IO.Path.GetExtension(fileName).Trim().ToLower();
// 允许的⽂件后缀
HashSet<string> hs = new HashSet<string> { ".bmp", ".gif", ".png", ".jpeg", ".jpg" };
return hs.Contains(fileExtension);
}
通过⽂件头
图⽚⽂件在头部信息 (⼀般都会在图⽚⽂件最开始的⼏个字节) 中都会包含图⽚的格式信息
/// <summary>
/// 图⽚类型帮助类
/// </summary>
public class ImageFormatHelper
{
/// <summary>
/// 获取图⽚类型
/// </summary>
/
// <param name="bytes"></param>
/// <returns></returns>
public static PictureFormat GetPictureFormat(byte[] bytes)
{
if (bytes == null || bytes.Length < 2)
{
return PictureFormat.UNKNOWN;
}
if (Enum.TryParse($"{bytes[0]}{bytes[1]}", out PictureFormat format))
{
if (Enum.IsDefined(typeof(PictureFormat), format))
{
return format;
}
}
return PictureFormat.UNKNOWN;
}
public enum PictureFormat
{
BMP = 6677,
GIF = 7173,
WEBP = 8273,
PNG = 13780,
JPG = 255216,
UNKNOWN = 0
}
}
unknown怎么处理// 判断图⽚类型
PictureFormat imageFormat = ImageFormatHelper.GetPictureFormat(uploadFileBytes);
if (imageFormat != PictureFormat.GIF
&& imageFormat != PictureFormat.JPG
&& imageFormat != PictureFormat.PNG)
{
result = $"图⽚格式为 {imageFormat} ,请重新上传";
return result;
}
通过 ImageIO 判断
通过数据流创建 Image 对象,能够正常创建对象。
如果是 webp 图⽚,使⽤Image.FromStream读取图⽚会发⽣异常。
System.Drawing.Image MyImage = System.Drawing.Image.FromStream(file.InputStream);
图⽚⽂件的安全检查处理
通过上⾯的⽅法,确认上传的⽂件是图⽚了,但是如果在可以正常打开的图⽚⾥⾯加⼊⾮法代码或者病毒,那就⾮常危险了。
那么怎么可以预防这种情况,既能够正常打开,⼜能获取图⽚的宽⾼等属性,可以对图⽚进⾏重写,新⽣成的图⽚不会有这种恶意代码了。给图⽚加⽔印
可以将透明度调为0,乍⼀看跟原图⼀样,其实不是上⾯的那张原图了
备注