通过幻数确定文件类型

问题描述 投票:0回答:2

我必须检查文件上传器中的文件类型以确定文件是否是图像(jpg,png),我决定通过使用 FileReader 读取文件的幻数(前 4 个字节)来做到这一点,但我对此方法有一些疑问:

  1. 这个方法安全吗?有没有办法用这种方法将非jpg文件上传为jpg?

  2. 我见过具有不同幻数大小的文件类型,例如 2、4、6 字节...因此,如果我必须制定一个通用方法来不仅确定图像文件类型,还确定其他文件类型,我将不得不读取最大文件类型文件中的字节数(以确定最大幻数),对吗?

javascript file-type magic-numbers
2个回答
0
投票
  1. 这不安全。问题不仅在于幻数,还在于您尝试在客户端验证它。 表单可以直接从脚本上传,绕过客户端验证。 正确的方法是使用经过验证的技术验证服务器端的所有内容。

  2. 对。不同的文件格式在不同的偏移量上有不同的幻数。但如果你关心安全——不要相信任何东西。


0
投票

对于你的第一个问题,如果这就是你所说的“安全”的意思,那么检查文件的幻数不会造成任何损害。这是一种完全有效且可接受的方法,用于验证文件类型至少在名义上与它所说的相符。它肯定比只检查文件类型甚至 MIME 类型要好。这不会是一个万无一失的方法,但大多数万无一失的方法对于客户端验证来说太繁重了。因此,接受的答案是正确的,您也应该验证服务器端。

这确实会给你带来更好的用户体验。您会惊讶地发现有多少人会重命名文件并认为这就是转换文件类型所需的全部。这将捕获这一点,而文件扩展名甚至 MIME 类型则不会。如果 Jane 阿姨发现您的应用程序只接受 JPG,那么她可能会将她的 PNG 重命名为 JPG 并尝试上传。如果您的应用程序仅检查 MIME 或文件扩展名,它将错误地上传该 JPG,然后您的服务器将必须响应您的客户端应用程序,告诉您这不是可接受的文件格式。如果您验证幻数,您就可以节省往返服务器的时间,并向用户提供近乎即时的反馈。

这与我们验证邮政编码或电子邮件的原因相同。它不会验证它的正确性,但它有助于捕获用户错误并提供更愉快和响应更快的体验。

对于第二个问题,粗略的想法是创建一个包含所有可接受的幻数的对象,迭代该对象以找到最长的一个,然后从文件中读取那么多字节。对于某些情况可能有进一步的逻辑,但通常这足以捕获大多数文件类型。

这是一个神奇数字列表。如果按偏移量排序,您会发现大多数文件类型没有偏移量,而在有偏移量的文件类型中,我认为我曾经使用过的唯一文件类型是

dmg
iso
。此外,在没有偏移量的文件类型中,最长的幻数看起来是 35 个字节(粗略地看了一下,我可能是错的)。您可能可以安全地只读取文件的前 35 个字节,甚至不必遍历列表,35 个字节是如此之小,实际上可能比费心迭代步骤来确定数组中的最长签名更快。

© www.soinside.com 2019 - 2024. All rights reserved.