如何检查上传的文件是否为没有MIME类型的图像?
我想检查一个上传的文件是否是一个图像文件(如PNG,JPG,JPEG,GIF,BMP)或其他文件。 问题是我正在使用Uploadify上传文件,这些文件会更改MIME类型,并给出“文本/八进制”或其他类型的MIME类型,无论您上传的是哪种文件类型。
有没有办法检查上传的文件是否是一个图像,除了使用PHP检查文件扩展名?
你可以使用getimagesize()
,它在非图像上返回零大小。
我对这个主题的想法很简单:所有上传的图像都是邪恶的。
不仅因为它们可以包含恶意代码,而且特别是因为元标记。 我了解使用隐藏元标记浏览网页以找到一些受保护图像的抓取工具,然后播放其版权。 也许有点偏执狂,但由于用户上传的图片在版权问题上失控,我谨慎考虑。
为了摆脱这些问题,我使用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');
这并不完全回答你的问题,因为这与接受的答案相同,但我给你我的理由使用它,至少:-)
您可以通过检查文件开头的幻数来验证图像类型。
例如:每个JPEG文件都以“FF D8 FF E0”块开始。
这里是关于魔术数字的更多信息
链接地址: http://www.djcxy.com/p/46683.html上一篇: How to check if an uploaded file is an image without mime type?