【问题标题】:Reliability of Mimetypes in Uploads (PHP)上传中 Mimetypes 的可靠性 (PHP)
【发布时间】:2011-08-25 09:46:16
【问题描述】:

这个问题我有一段时间了:文件的 mime 类型究竟是如何确定的?我相信这是通过检查文件的特定字节是否包含任何已知的magic numbers / file signatures 来完成的,对吧?

如果是这样,这就提出了另一个问题,假设我将一个带有假 GIF 文件签名的 bash 脚本上传到一个只允许上传图像的网站,会发生什么?要么:

  1. mimetype 检测例程足够智能,可以检测到虚假签名,或者
  2. image/gif 被错误地返回为 mimetype 并允许继续上传

我没有安装 ATM 的 HEX 编辑器,我不喜欢从测试中得出与安全相关的结论,因为我可能会遗漏(或误解)某些东西,所以我的问题是:以上选项中的哪一个是对吗?

此外,是否有任何其他最佳做法(除了检查 mimetype)来确保任何给定文件实际上是它看起来/需要(或允许)的内容?提前致谢。

PS:为了清楚起见,我不是在询问$_FILES 超全局中的type 索引。

【问题讨论】:

    标签: php security file-upload mime-types mime


    【解决方案1】:

    我的理解是文件上传代码中的 MIME 确定例程非常粗糙,并且 $_FILES 数组中的 MIME 类型根本不可信。根据我的经验,它很容易被欺骗。

    您最好使用 Fileinfo 库,它提供更强大的文件类型检测。

    http://www.php.net/manual/en/ref.fileinfo.php

    【讨论】:

    • $_FILES中的type索引来自浏览器/用户,根本不可信。我正在使用 Fileinfo(或类似的),但问题仍然存在:如果 mime 是伪造的,Fileinfo 是否足够聪明,可以检测到这一点?
    • 据我从文档中了解到,Fileinfo 会查看标头并执行一些启发式方法来检测文件类型,并且不需要(或依赖)浏览器发送的信息。
    • PHP 手册中关于 fileinfo 的页面说文件检测不是 100% 可靠的。我假设您可以制作一个可以欺骗它的文件。
    • @GordonM:你知道比 Fileinfo 更可靠的方法吗?
    • 我想您可以 exec() 一个外部实用程序,例如 *ix 文件。我认为 file 实用程序的工作方式与 fileinfo 相同,通过在文件中查找魔术字节。我怀疑没有 100% 可靠的方法来确定文件类型。毕竟,您可以将 PHP 脚本附加到 GIF 文件上,而对于图像查看器来说,它仍然看起来像 GIF 文件。与其试图找到一种方法来保证文件类型,不如找到一种对上传文件进行沙盒处理并限制它们可以做的事情的方法,例如关闭它们上传到的目录的 PHP 引擎跨度>
    【解决方案2】:

    如果您谈论的是$_FILES['userfile']['type'],则此信息由浏览器发送。它可能存在也可能不存在,即使它存在,您也应该像对待任何其他用户输入一样对待它。

    如果您对检查图像感兴趣,可以使用 getimagesize 函数来确定文件类型。对于无法理解的图像,此函数返回 NULL。即使它返回有效的图像类型,您仍然可以拒绝该文件,例如如果您期待 GIF 和 JPEG,而您得到的是 TIFF。

    此外,网络服务器将根据文件权限(执行位和 shebang 行)和文件扩展名来确定是否执行文件。如果你继续检查这两个,你可能没问题。

    【讨论】:

      【解决方案3】:

      我的理解是,这(易受攻击的 MIME 类型)是文件名在上传时应通过各种方式加密然后存储在数据库中以通过 ID 号检索的原因。基本上应该有人设法上传恶意脚本,他们永远无法找到它来运行它?

      【讨论】:

      • 但存储在数据库或 CDN 上并不总是一种选择。掩盖文件名不能被认为是安全的,并且会丢失可能有价值的语义数据(文件名本身)。我知道架构选项和预防措施,但我的问题主要针对 mime 类型(错误?)检测和可能的替代方案。
      猜你喜欢
      • 2012-09-14
      • 2012-08-19
      • 2015-03-18
      • 2013-06-05
      • 2011-10-06
      • 2012-05-20
      • 2017-01-27
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多