如何检查上传的文件是否是没有哑剧类型的图像?

我想检查上传的文件是图像文件(例如png,jpg,jpeg,gif,bmp)还是其他文件。问题是我正在使用Uploadify上传文件,这会更改哑剧类型并给出“文本/八进制”或什么作为哑剧类型,无论您上传哪种文件类型。

除了使用PHP检查文件扩展名之外,还有没有办法检查上传的文件是否是图像?


答案 1

我对这个主题的想法很简单:所有上传的图像都是邪恶的。

不仅因为它们可能包含恶意代码,而且特别是因为元标记。我知道爬虫浏览网页以使用其隐藏的元标记查找一些受保护的图像,然后玩弄其版权。也许有点偏执,但由于用户上传的图像对版权问题失去了控制,我认真考虑了这一点。

为了摆脱这些问题,我使用gd系统地将所有上传的图像转换为png。这有很多优点:图像从最终的恶意代码和元标记中清除,我只有一种格式用于所有上传的图像,我可以调整图像大小以适应我的标准,并且...我立即知道图像是否有效!如果无法打开图像进行转换(使用不关心图像格式的imagecreatefromstring),那么我认为图像无效。

一个简单的实现可能如下所示:

function imageUploaded($source, $target)
{
   // check for image size (see @DaveRandom's comment)
   $size = getimagesize($source);
   if ($size === false) {
      throw new Exception("{$source}: Invalid image.");
   }
   if ($size[0] > 2000 || $size[1] > 2000) {
      throw new Exception("{$source}: Too large.");
   }

   // loads it and convert it to png
   $sourceImg = @imagecreatefromstring(@file_get_contents($source));
   if ($sourceImg === false) {
      throw new Exception("{$source}: Invalid image.");
   }
   $width = imagesx($sourceImg);
   $height = imagesy($sourceImg);
   $targetImg = imagecreatetruecolor($width, $height);
   imagecopy($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height);
   imagedestroy($sourceImg);
   imagepng($targetImg, $target);
   imagedestroy($targetImg);
}

要测试它:

header('Content-type: image/png');
imageUploaded('http://www.dogsdata.com/wp-content/uploads/2012/03/Companion-Yellow-dog.jpg', 'php://output');

这并不能完全回答你的问题,因为这是与公认的答案相同的黑客,但我给你我使用它的理由,至少:-)


答案 2

您可以使用 getimagesize() 在非图像上返回零大小。


推荐