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

Kiz*_*izz 4 asp.net security

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

Geo*_*ton 6

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


Pas*_*man 5

最简单的方法是检查输入流的标题并查找特定的签名:

  • 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;
        }
Run Code Online (Sandbox Code Playgroud)

当然你必须处理异常