2012-03-17 46 views
2

我聽說來處理上傳的圖片的最好的辦法就是「再處理」他們使用GD庫和保存處理後的圖像重新處理。見:PHP image upload security check list

我的問題是如何在GD做到這一點「再加工」?這意味着什麼?我不知道GD庫非常好,我怕我會亂起來......圖片上傳安全 - 與GD

因此,如果任何人誰這樣做過你能不能給我一個這樣的例子?我在這裏找到了一個答案:Remove EXIF data from JPG using PHP,但是現在我不能使用ImgMagick了,順便說一下..刪除EXIF數據意味着完全重新創建這個圖片。 ?情況)
(我使用Zend框架,如果有人感興趣)

回答

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 
} 

然後,您可以丟棄所述$newIm圖像使用imagedestroy()和使用用戶上傳的文件,或從GD中保存圖像並使用它。保存GD圖像可能存在一些問題,因爲它不是原始圖像。

另一種簡單的方法是將檢查圖像文件的頭部(第幾個字節),以確保它是正確的;例如所有的JPEG文件都以0xff 0xd8開頭。

又見imagecreatefromstring(),你也可以使用getimagesize()到上傳的圖片上運行類似的檢查。

+0

報價(和getimagesize)「小心 此函數希望文件名是一個有效的圖像文件。如果非圖像文件被提供時,它可能被錯誤地檢測爲一個圖像和該函數將返回成功,但陣列可能包含無意義的值。 不要使用和getimagesize()來檢查一個給定的文件是一個有效的圖像,使用作爲Fileinfo的擴展這種特製的解決方案,而不是「。 – 2017-07-18 19:40:11

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']); .....