我正在编写一些东西,允许用户在网络服务器上存储文档和图片,以便以后存储和检索。当用户将文件上传到我的服务器时,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 P N G \ 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归因
不隶属于 StackOverflow
scroll top