上传中Mimetypes的可靠性(PHP)

时间:2011-05-14 06:38:42

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

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

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

  1. mimetype检测程序足够智能,可以检测假签名,或
  2. 错误地将
  3. image/gif作为mimetype返回,并且允许继续上传
  4. 我没有安装ATM的HEX编辑器,我不喜欢从测试中得出与安全相关的结论,因为我可能会错过(或误解)某些内容,所以我的问题是:上面的选项之一是正确的吗?

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

此外,Web服务器将确定是否执行不依赖于文件权限(执行位和shebang行)和文件扩展名的文件。如果你对这两个进行检查,你可能还可以。

答案 2 :(得分:-1)

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