如何在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