zoukankan      html  css  js  c++  java
  • 对上传的图片进行格式校验以及安全性校验

    对上传的图片进行格式校验以及安全性校验

    图片上传服务器后,需要对其进行安全校验

    判断上传的是否是图片

    通过后缀名进行判断

    • 最基本的校验:校验文件的后缀名是否符合要求的格式。
    • 这种非常的不靠谱,完全可以修改文件的后缀名绕过检验。
    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
        }
    
    }
    
    
    // 判断图片类型
    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,乍一看跟原图一样,其实不是上面的那张原图了

    备注

    参考链接

  • 相关阅读:
    nginx配置url伪静态
    PHP爬虫之queryList
    PHP 判断给定两个时间是否在同一周,月,年
    服务器nginx配置显示文件而不是下载
    PHP yield占用内存测试
    PHP 函数运行的内存
    io系列之字节流
    io系列之字符流
    对于Arrays的deep相关的方法。
    常用工具类(System,Runtime,Date,Calendar,Math)
  • 原文地址:https://www.cnblogs.com/frank-zhang/p/14234689.html
Copyright © 2011-2022 走看看