繁体   English   中英

如何辨别某人伪造文件类型? (PHP)

[英]How do I tell if someone's faking a filetype? (PHP)

我正在编写一些东西,允许用户在网络服务器上存储文档和图片,以便以后存储和检索。 当用户将文件上传到我的服务器时,PHP会根据扩展名告诉我它是什么文件类型。 但是,我担心用户可以将zip文件重命名为somezipfile.png并存储它,从而在我的服务器上保留一个zip文件。 有没有合理的方法来打开上传的文件并“检查”以查看它是否真的属于所述文件类型?

幻数 如果你可以读取二进制文件的前几个字节,你就可以知道它是什么类型的文件。

查看PHP的FileInfo PECL扩展,它可以为您执行MIME魔术查找。

有点。 大多数文件类型都保留了一些字节用于标记它们,因此您不必依赖扩展名。 网站http://wotsit.org是一个很好的资源,可以找到特定类型的这个。

如果您使用的是unix系统,我相信file命令不依赖于扩展,因此如果您不想编写字节检查代码,可以使用它。

对于PNG( http://www.w3.org/TR/PNG-Rationale.html

PNG文件的前八个字节始终包含以下值:

(十进制)137 80 78 71 13 10 26 10

(十六进制)89 50 4e 47 0d 0a 1a 0a

(ASCII C表示法)\\ 211 PNG \\ r \\ n \\ 032 \\ n

许多文件类型在文件的开头都有“ 魔术数字 ”来识别它们。您可以从文件的前面读取一些字节,并将它们与已知幻数列表进行比较。

如果您只处理图像,那么getimagesize()应该区分有效图像和伪图像。

$ php -r 'var_dump(getimagesize("b&n.jpg"));'
array(7) {
  [0]=>
  int(200)
  [1]=>
  int(200)
  [2]=>
  int(2)
  [3]=>
  string(24) "width="200" height="200""
  ["bits"]=>
  int(8)
  ["channels"]=>
  int(3)
  ["mime"]=>
  string(10) "image/jpeg"
}

$ php -r 'var_dump(getimagesize("/etc/passwd"));'
bool(false)

来自getimagesize的错误值不是图像。

在unix系统上,从'file'命令捕获输出应该提供足够的信息。

有关如何在PHP中快速完成此操作的确切答案,请查看以下问题: 如何使用php查找文件的mime类型?

作为旁注,我遇到了类似的问题,我不得不进行自己的类型检查。 我的应用程序的前端界面是在flash中完成的。 这些文件正在通过flash传递给php脚本。 当我尝试使用php进行MIME类型检查时,总是返回的类型是application / octetstream,因为它来自flash。

我必须实现一个神奇的数字类型范例。 我只是创建了一个xml文件,其中包含文件类型以及在文件开头找到的一些定义模式。 一旦文件到达服务器,我做了一些与xml文件匹配的模式,然后接受或拒绝该文件。 我没有注意到任何真正的性能下降,这是我期待的。

对于可能正在使用flash作为前端并尝试在上传文件后键入检查的人,这只是一个附注。

除了识别文件类型之外,您可能还需要注意嵌入或附加了其他文件的文件。 遗憾的是,这需要对文件内容进行更深入的分析,而不仅仅是使用“魔术数字”。

例如, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (这种特殊类型的数据隐藏可以通过加载和将实际图像数据重新保存到新文件中......其他图像将更加困难。)

暂无
暂无

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

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