如何在PHP中检查上传文件的文件类型?

在PHP网站上,他们建议的唯一真正的检查就是在这里使用is_uploaded_file()move_uploaded_file() 。 当然,由于各种原因,您通常不希望用户上传任何类型的文件。

正因为如此,我经常使用一些“严格”的MIME类型检查。 当然,这是非常有缺陷的,因为通常mime类型是错误的,用户不能上传他们的文件。 假冒和/或改变也很容易。 除此之外,每个浏览器和操作系统都以不同的方式处理它们。

另一种方法是检查扩展名,这当然比MIME类型更容易改变。

如果你只需要图像,使用像getimagesize()这样的东西就可以工作。

其他类型的文件呢? PDF,Word文档或Excel文件? 甚至只有文本文件?

编辑:如果你没有mime_content_type或Fileinfo和系统(“file -bi $ uploadedfile”)给你错误的文件类型,还有什么其他的选择?


看看mime_content_type或Fileinfo。 这些是内置的PHP命令,用于通过查看文件的内容来确定文件的类型。 同时检查上述两页的评论,还有一些其他的好建议。

就个人而言,我使用基本上是system("file -bi $uploadedfile")东西system("file -bi $uploadedfile")获得了好运,但我不确定这是否是最好的方法。


恕我直言,所有的MIME类型检查方法都是无用的。

假设你有哪些应该有MIME类型的application/pdf 。 标准方法试图找到看起来像PDF标题的东西( %PDF- PDF或者像这样的),并且它们会在成功时返回'好吧,看起来这是一个PDF文件'。 但实际上这并不意味着什么。 您可以上传仅包含%PDF-1.4的文件,并且它会通过MIME检查。

我的意思是如果该文件具有预期的MIME类型 - 它将始终通过MIME类型检查,否则结果是未定义的。


我假设你将有一个你将接受的固定的文件类型白名单。

对于这些类型中的每一种,您都必须使用不同的技术来验证它们是该格式的有效示例。

有两个相关的问题:

  • 它看起来大致像它可能是正确的类型? (对于JPEG,你可以检查标题,正如你所提到的那样。对于许多基于Unix的格式,你可以检查“magic cookie”。)

  • 它实际上是这种类型的有效示例(例如,对于任何类似XML的格式,您可以根据DTD进行验证。)

  • 我认为,对于每种格式,您应该针对每种格式提出单独的问题,因为与ZIP文件相比,PDF的答案会非常不同。

    链接地址: http://www.djcxy.com/p/45667.html

    上一篇: How to check file types of uploaded files in PHP?

    下一篇: How to Boost::serialize a hashmap of vectors?