安全性:如何验证图像文件上传?

时间:2011-04-09 17:06:21

标签: php image security upload mime-types

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

我如何检查并100%确定我没有收到恶意文件?

检查mime类型?重新绘制图像?防病毒?

4 个答案:

答案 0 :(得分:8)

重绘图片,使用GDimagecreatefromXXX()进行阅读并使用imageXXX()

将其保存回来

通过这种方式,您还可以将其缩放到更方便的尺寸,并控制带宽消耗。

为了节省计算能力,请拒绝上传到大于某个限制的文件。

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

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

  

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

     

最后发出警告: on Windo(w)s convert也是一个用于格式化硬盘的命令,因此需要付出一些努力来消除歧义如果你部署它。

答案 1 :(得分:1)

如果您担心恶意文件使用防病毒检查程序,或者更好,其中两个可能会因为某个特定的新病毒而落后。

可以使用file欺骗MIME类型。

您可以使用代码打开它,检查所有块是否都是正确的大小,但利用漏洞利用用于打开图像的代码中的漏洞。如果你的代码没有加强并且知道它可以被利用的所有方式,你可能会打开在主机/服务器上利用的大门 - 它几乎是一个鸡和蛋的情况,所以我倾向于更多地信任几个防病毒工具。

答案 2 :(得分:1)

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

$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类型以进行更准确的验证。

答案 3 :(得分:-2)

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

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