2013-10-10 45 views
0

我有一个允许上传大多数文件类型的上传表单。 在这里,他们是:PHP安全文件上传

  • 图片:JPG/JPEG/PNG/GIF ...
  • 视频:MP4/AVI/WMV ...
  • 另一个文件:DOC/PDF/RAR/ZIP/mp3/...

对于图像文件,我知道我可以使用PHP函数getimagesize()或其他东西来确保它是真实的图像。但其他文件如视频和文档如何?这是一个真正的文件,没有伪造扩展名?

如何做到这一点?

谢谢!我需要你的帮助。

+2

看到这样的回答:http://stackoverflow.com/q/134833/467164 –

回答

0

每一个文件都有它自己的类型,称为MIME类型,以便ü可以检查MIME类型,做这样的一些东西:

if (mime_content_type($FILES['file']['tmp'])== "image/png")) 
{ 
// do upload 
}else{ 
die('file type not supported');} 

ü可以把所有的MIME类型到一个数组检查与in_array功能 类型u能找到所有的MIME类型在这里:http://www.freeformatter.com/mime-types-list.html

+2

永远不使用'$ _FILES [ '文件'] [ '型']'任何东西!这是从客户端发送的MIME类型,可以像文件扩展名一样容易伪造。 – deceze

+0

so use mime_content_type –

+0

更好,但不推荐使用'mime_content_type'。 – deceze

0

任何客户端检查(甚至是浏览器的MIME类型检测),是注定要失败,因为用户可以访问它。您最好让上传开始并完成,然后执行严重的服务器端检查。如果这不符合您的预期,您只需放弃该文件即可。

在服务器端的顶部检查,你当然可以实现客户端检查只是一个整洁的用户体验

-1

充分确保文件上传的唯一方法就是尝试用PHP解析上传的文件或其他一些需要特定有效文件类型的扩展/工具。换句话说:

  • 图片:使用GD函数来解析文件,如果它不是一个有效的图像,它们将返回false。
  • 视频:或许可以验证使用命令行上的ffmpeg和检查输出,或使用ID3扩展为这里建议:https://stackoverflow.com/a/134893(信贷上的问题链接到这个问题Zathrus作家的评论)
  • 文件:尝试加载文件与PHPExcel/Word/PowerPoint,虽然我不确定这些将支持这些文件的任何格式,因为它在OpenXML上工作。

从查看getID3扩展,这可能是最好的选择,因为它似乎是解析各种各样的内容类型。

在任何情况下,您基本上需要的是PHP或其他第三方库/扩展程序来确定文件的二进制数据与其MIME内容类型相对应。

希望这有助于:)