如何在不依赖文件扩展名的情况下检查上传文件的内容?

4
如何在不使用扩展名的情况下可靠地验证上传文件的类型?我猜你必须检查文件头/读取一些字节,但我真的不知道如何去做。我使用c#和asp.net。
谢谢任何建议。
好的,所以从上面的链接中,我现在知道我要寻找“ff d8 ff e0”来明确识别.jpg文件。
在我的代码中,我可以轻松读取前20个字节:
                FileStream fs = File.Open(filePath, FileMode.Open);
                Byte[] b = new byte[20];
                fs.Read(b, 0, 20);

那么(请原谅我的完全不熟悉),我该如何检查字节数组是否包含“ff d8 ff e0”?

5个回答

4

以下是对你发布的后续问题的快速回复:

byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 };
bool match = true;
for (int i = 0; i < jpg.Length; i++)
{
    if (jpg[i] != b[i])
    {
        match = false;
        break;
    }
}

2

这确实是Unix中的file程序所做的事情,可靠性大小不一。部分原因在于你尝试检测的文件所属程序是否发出了文件头;程序tar以不发出文件头而著称。它取决于你计划尝试识别多少类型的文件,但使用file的实现可能是最简单的方法;它可以识别许多文件类型,并且现代版本可以通过一个额外的文件类型定义文件进行扩展,以处理各种场景。


2

链接已损坏。 - David Klempfner
1
@DavidKlempfner添加了另一个链接以检查资源。 - Lou Franco
有没有可以验证文件内容的NuGet包?我似乎找不到一个。 - David Klempfner

1

因为我正在使用一个将所有内容作为二进制流传输的组件! - flesh
第一个链接比第二个更全面。 - Jonathan Leffler
2
你不能依赖Content-Type,因为客户端可能会故意声称不正确的Content-Type作为攻击的一部分。相信Content-Type与相信文件扩展名一样不可靠。 - Dave Sherohman
信任内容类型或文件扩展名比信任文件头部(前几个字节)更糟糕吗?因为文件头部也可能被伪造。 - Kibbee
第二个链接已经失效。 - David Klempfner

-1

读取文件内容是最可靠的方法。由于您正在使用 .Net 构建它,您可能可以检查已上传文件的 MIME 类型。

您可以使用 DllImport urlmon.dll 进行帮助。请参考以下文章: http://coding-passion.blogspot.com/2008/11/validating-file-type.html

并且要澄清有关 Content-type 的问题,它通常由文件扩展名驱动。因此,即使将 .zip 文件的扩展名重命名为 .txt,内容类型仍将显示为纯文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接