MIME类型欺骗

abr*_*ski 13 html php security spoofing mime-types

在php中检查mime类型非常简单,但据我所知,mime可能会被欺骗.攻击者可以使用例如jpeg mime类型上传php脚本.我想到的一件事是检查上传文件的文件扩展名,并确保它与mime类型匹配.所有这一切都假设上传目录是浏览器可访问的.

问题:是否还有其他技术可以防止"坏文件"进入mime类型欺骗?

emb*_*oss 9

简答:不.

更长的回答:

比较扩展并确保它与MIME类型匹配并不能真正阻止任何事情.正如评论中所说,修改文件扩展名更加容易.MIME类型和扩展名仅作为提示,它们没有固有的安全性.

确保传入文件不会造成伤害,这在很大程度上取决于您对它们的目的是什么.在你的情况下,我明白你期待图像.所以你可以做的是首先执行一些健全性检查:扫描前几个字节以查看文件是否包含相关的图像标题签名 - 所有相关的图像格式都有这些.

"签名标题"可帮助您确定文件尝试模拟的图像格式类型.在下一步中,您可以检查其余内容是否符合基础图像格式.这将保证您的文件实际上是该特定格式的图像文件.

但即便如此,文件也可以通过以下方式精心制作:当您显示图像时,用于显示该图像的流行库(例如libpng等)会遇到攻击者在该库中找到的缓冲区溢出.

不幸的是,除了不允许来自客户端的任何输入之外,没有办法主动防止这种情况.


sti*_*vlo 5

注意 - 这个答案现在已经过时了

getimagesize 的文档明确指出“不要使用 getimagesize() 来检查给定文件是否为有效图像。

在图像的情况下

  • 使用允许的列表检查扩展名(例如“.jpg”、“.jpeg”、“.png”)
  • 通过在文件上运行getimagesize来检查上传的文件本身,如果它不是图像,它将返回 FALSE。

其他类型的上传

  • 检查允许的扩展名(例如“.pdf”)
  • 检查文件的 MIME 类型是否与扩展名对应

示例代码:

function getRealMimeType($filename) {
    $finfo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic"); 
    if (!$finfo) {
        echo "Opening fileinfo database failed";
        return "";
    }
    return $finfo->file($filename);
}
Run Code Online (Sandbox Code Playgroud)

请参阅finfo_file文档。

  • `getimagesize` 的文档明确指出“不要使用 getimagesize() 来检查给定文件是否是有效图像。请使用专门构建的解决方案,例如 Fileinfo 扩展名。” (2认同)