繁体   English   中英

ASP.NET 文件上传:如何确保上传的文件确实是 JPEG?

[英]ASP.NET File Upload: how can I make sure that an uploaded file is really a JPEG?

犯罪分子可以伪造他上传的文件的内容类型。 所以,如果我通过我的页面在服务器上接收到文件,我不能只检查它的 MIME 类型和文件扩展名。 是否有任何可靠的方法来检查上传的文件是否实际上是 JPEG、GIF 或 PNG? 我需要拒绝所有其他格式。 我可以尝试一点一点地读取文件,但我在寻找什么? 感谢您提出任何建议或想法!

您可以尝试使用Bitmap.FromStream(stream)解析 try-catch 内的图像,并使用上传图像中的 stream 。 如果它失败了,你就知道它不是一个真实的图像。 它被认为是异常编码,但在这种情况下,您实际上是在寻找异常。

最简单的方法是检查输入 stream 的 header 并查找特定签名:

  • JPEG:FF D8(十六进制)
  • GIF:前三个字节“GIF”
  • PNG:137 80 78 71 13 10 26 10 十进制

ASP.NET 中的示例

        bool isValid = false;
        char[] header = new char[10];
        StreamReader sr = new StreamReader(Request.InputStream);
        sr.Read(header, 0, 10);

        // check if JPG
        if (header[0] == 0xFF && header[1] == 0xD8)
        {
            isValid = true;
        }
        // check if GIF
        else if (header[0] == 'G' && header[1] == 'I' && header[2] == 'F')
        {
            isValid = true;
        }
        // check if PNG
        else if (header[0] == 137 && header[1] == 80 && header[2] == 78 && header[3] == 71 && header[4] == 13 && header[5] == 10 && header[6] == 26 && header[7] == 10)
        {
            isValid = true;
        }

当然你必须处理异常

您可以检查文件是否具有 JPEG/GIF/PNG 的文件签名 但这些也可能被攻击者模仿(尽管它可能会破坏任何恶意 exe)。 或者您可以尝试使用 Windows Forms 或您有什么,将图像数据转换为 bitmap 并查看它是否引发异常。

您不需要这样做,只要您使用上传时的 MIME 类型来提供它。 问题在于某些 Web 浏览器 (IE) 在数据“看起来像”它认为它知道如何处理的东西时忽略 MIME 类型。 在这种情况下,你真正想做的是模仿 IE 的文件类型检测; 除非您知道它查看前几个字节,否则这并不容易。

“安全”的方法是重新编码图像(可能缩小图像并降低质量以减小文件大小)。 这最大限度地减少了攻击者对 output 的控制量。 (当然,人们可能不会欣赏重新编码的图像,但大多数 web 服务都会这样做。)

此外,重新编码图像通常会去除元数据(例如相机序列号),这有利于隐私。 当用户认为他们已经裁剪了某些内容但图像编辑器将其保留在缩略图中时,这尤其有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM