图像上传安全性 - 使用GD重新处理

时间:2012-03-17 21:47:15

标签: php security zend-framework gd

我听说处理上传图片的最佳方法是使用GD库“重新处理”它们并保存处理过的图像。见:PHP image upload security check list

我的问题是GD中如何“重新处理”?这究竟意味着什么?我不太了解GD库,我担心我会搞砸......

所以如果之前有人这么做过你能给我一个例子吗?

(我知道,另一个选择是使用ImageMagick。对于ImageMagick,我在这里找到了答案:Remove EXIF data from JPG using PHP,但我现在不能使用ImgMagick。顺便说一下..删除EXIF数据意味着完全重新创建在这种情况下的图像?)
(如果有人有兴趣,我正在使用Zend Framework。)

2 个答案:

答案 0 :(得分:4)

如果用户上传了JPEG文件,您可以执行以下操作来重新处理它:

$newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']);
if (!$newIm) {
    // gd could not create an image from the source
    // most likely, the file was not a valid jpeg image
}

然后,您可以使用imagedestroy()丢弃$newIm图像,并使用用户上传的文件,或者保存GD中的图像并使用它。保存GD图像可能存在一些问题,因为它不是原始图像。

另一个简单的方法是检查图像文件的标题(前几个字节)以确保它是正确的;例如,所有JPEG文件都以0xff 0xd8开头。

另请参阅imagecreatefromstring(),您还可以使用getimagesize()对上传的图片执行类似的检查。

答案 1 :(得分:2)

function isvalidjpeg($file) 
{ 
$finfo = finfo_open(FILEINFO_MIME_TYPE);
return is_resource($finfo) && 
       (finfo_file($finfo, $file) === 'image/jpeg') && 
       finfo_close($finfo);
}
if(isvalidjpeg($_FILES['file']['tmp_name'])) {
   $newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']); .....