【问题标题】:PHP secure file uploadPHP安全文件上传
【发布时间】:2013-10-18 08:23:31
【问题描述】:

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

  • 图片:jpg/jpeg/png/gif ...
  • 视频:mp4/avi/wmv ...
  • 其他文件:doc/pdf/rar/zip/mp3/...

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

怎么做?

谢谢!我需要你的帮助。

【问题讨论】:

标签: php file-upload


【解决方案1】:

每个文件都有自己的类型,称为 mime type ,所以你可以检查 mime 类型,做一些类似的事情:

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

你可以将所有mime类型放入一个数组中,用in_array函数检查类型 你可以在这里找到所有的 mime 类型:http://www.freeformatter.com/mime-types-list.html

【讨论】:

  • 永远不要使用$_FILES['file']['type'] 做任何事情!它是客户端发送的 mime 类型,可以像文件扩展名一样容易伪造。
  • 所以使用 mime_content_type
  • 更好,但不推荐使用mime_content_type
【解决方案2】:

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

在服务器端检查之上,您当然可以实现客户端检查,以获得更整洁的用户体验

【讨论】:

    【解决方案3】:

    完全保护文件上传的唯一方法是尝试使用 PHP 或其他需要特定有效文件类型的扩展程序/工具来解析上传的文件。换句话说:

    • 图像:使用 GD 函数解析文件,如果不是有效图像,它们将返回 false。
    • 视频:可能可以在命令行上使用 ffmpeg 进行验证并检查输出或使用此处建议的 ID3 扩展名:https://stackoverflow.com/a/134893(感谢 Zathrus 作家对链接到此问题的问题的评论)
    • 文档:尝试使用 PHPExcel/Word/PowerPoint 加载文件,尽管我不确定它们是否支持这些文档的任何格式,因为它适用于 OpenXML。

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

    无论如何,您基本上需要 PHP 或其他一些第三方库/扩展来确定文件的二进制数据与其 MIME 内容类型相对应。

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2012-04-14
      • 2013-02-14
      • 2012-06-18
      • 1970-01-01
      • 2011-02-14
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多