PHP检查文件是否是图像

有没有办法确保收到的文件是在PHP的图像?

扩展testing听起来不太安全,因为您可以上传script并将其扩展名更改为任何您想要的。

我也尝试过使用getimagesize ,但是可能会有更适合这个问题的东西。

原生的方式来获取mimetype:

对于PHP <5.3使用mime_content_type()
对于PHP> 5.3,使用finfo_fopen()

获取MimeType的替代方法是exif_imagetype和getimagesize ,但这些依赖于安装了相应的库。 此外,他们可能会返回图像mimetypes,而不是magic.mime给出的整个列表。

mime_content_type从PHP5.3中移除时,它在该版本下工作正常。 E_STRICT甚至不会提出关于它被弃用的通知。 如果你不想打扰系统中可用的东西,只需将所有四个函数包装到一个代理方法中,该代理方法将函数调用委托给任何可用的方法,例如

 function getMimeType($filename) { $mimetype = false; if(function_exists('finfo_fopen')) { // open with FileInfo } elseif(function_exists('getimagesize')) { // open with GD } elseif(function_exists('exif_imagetype')) { // open with EXIF } elseif(function_exists('mime_content_type')) { $mimetype = mime_content_type($filename); } return $mimetype; } 

getimagesize()应该是确定文件是否为图像的最明确的方法:

 if(@is_array(getimagesize($mediapath))){ $image = true; } else { $image = false; } 

因为这是一个样本getimagesize()输出:

 Array ( [0] => 800 [1] => 450 [2] => 2 [3] => width="800" height="450" [bits] => 8 [channels] => 3 [mime] => image/jpeg) 

使用文件扩展名和getimagesize函数来检测上传的文件是否具有正确的格式只是入门级的检查,它可以简单地通过上传一个真正的扩展名和一个图像标题的字节,但错误的内容的文件绕过。

为了安全和安全,您可以缩略图/resize(即使是原始图像大小)上传的图片,并保存此版本,而不是上传的图片。 也有可能获得上传的文件内容,并寻找像<?php特殊字符来查找该文件是否是图像。