【问题标题】:Security: How to validate image file uploads?安全性:如何验证图像文件上传?
【发布时间】:2011-08-02 03:56:19
【问题描述】:

我需要接受用户上传的图片文件。

我如何检查并 100% 确定我没有收到恶意文件或其他东西?

检查 MIME 类型?重新绘制图像?杀毒?

【问题讨论】:

  • 视情况而定。我不会去100%。你可能做不到。仅最大化。
  • 您应该注意的一件事是,即使它是无害的图像,也可能是其他东西。 thinkfu.com/blog/gifjavascript-polyglots 展示了如何构造一个有效的 GIF,它也是一个恶意的 JavaScript 文件。

标签: php image security upload mime-types


【解决方案1】:

重新绘制图像,使用GDimagecreatefromXXX() 阅读并使用imageXXX() 将其保存回来

通过这种方式,您还可以将其扩展到更方便的大小并控制带宽消耗。

为了节省计算能力,拒绝上传大于一定限制的文件。

5megs 或 10megs 应该没问题,因为有限制。

保持 GD 更新,并注意(显然是 7 年前)it used to sport buffer overflows 在处理 PNG 图像

或者,您也可以在后台使用 ImageMagickconvert 等命令对上传的图像进行预处理。

最后一点警告:在 Windo(w)s convert 也是一个用于格式化硬盘的命令,所以如果你想消除歧义,请努力部署在上面。

【讨论】:

  • ImageMagick 不是为这种事情编写的:lwn.net/Articles/206928。如果您在不受信任的输入上使用 ImageMagick,请将其沙箱化。任何东西,VMWare、Linux-VServer、UML 都可以帮助 ImageMagick 远离文件系统和特权处理器模式,因此如果它受到损害,唯一受到损害的就是 VM。
【解决方案2】:

如果您担心恶意文件,请使用防病毒检查程序,或者更好的是,使用其中两个,因为其中一个可能滞后于特定的新病毒株。

MIME 类型可以被欺骗,就像使用file 一样。

您可以使用代码打开它,检查所有块的大小是否正确,但漏洞利用利用了用于打开图像的代码中的缺陷。如果您的代码没有得到强化并且没有意识到它可能被利用的所有方式,那么您可能会打开主机/服务器上的漏洞利用之门 - 这几乎是鸡和蛋的情况,所以我更倾向于信任几个防病毒工具。

【讨论】:

    【解决方案3】:

    我不会进行 100% 的图像类型验证,我使用简单的脚本来检查图像类型验证

    <?php
    
    $imgExtension = array('jpg','jpe','jpeg','gif','png');
    $image_name = pathinfo($_FILES['image']['name']);
    $extension = strtolower($image_name['extension']);
    if(in_array($extension,$ImgExtension)) {
        //process file upload - move_uploaded_file()
    }
    
    ?>
    

    您仍然可以检查 mime 类型以进行更准确的验证。

    【讨论】:

    • 但是这样我可以简单地获取一个 .exe,将其重命名为 .jpg 并能够通过服务器部署它。
    【解决方案4】:

    我不确定它是否完全安全,但你可以使用

    if( getimagesize($filename) )
      //probably an image
    

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 2013-07-16
      • 2017-03-06
      • 2016-03-02
      • 2014-01-23
      • 2018-01-03
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多