2015-12-14 75 views
3

我有一個接受base64編碼圖像數據的API,需要解碼數據,保存圖像文件,然後從該圖像創建縮略圖。使用base64編碼圖像的安全問題

我擔心如果在嘗試創建縮略圖之前未正確驗證POST有效內容的內容,惡意代碼可能會被執行。

我到目前爲止的基本工作流程如下。是否有足夠的驗證,我不需要關心安全性?我想我擔心某人編碼不好的東西,然後當下面的一個圖像函數被調用時,互聯網爆炸。

<?php 

$decodedImage = base64_decode($_POST["canvas"]); 
if ($decodedImage === false) { 
    // Error out 
} 

$imageSizeValidation = getimagesizefromstring($decodedImage); 
if ($imageSizeValidation[0] < 1 || $imageSizeValidation[1] < 1 || !$imageSizeValidation['mime']) { 
    // Error out 
} 

$tempFilePath = "/tmp/" . microtime(true) . "-canvas-web.jpg"; 
file_put_contents($tempFilePath, $decodedImage); 

$originalWidth = $imageSizeValidation[0]; 
$originalHeight = $imageSizeValidation[1]; 
$newWidth = 49; 
$newHeight = 49; 

$scaleWidth = $newWidth/$originalWidth; 
$scaleHeight = $newHeight/$originalHeight; 
$scale = min($scaleWidth, $scaleHeight); 

$width = (int)($originalWidth * $scale); 
$height = (int)($originalHeight * $scale); 

$xpos = (int)(($newWidth - $width)/2); 
$ypos = (int)(($newHeight - $height)/2); 

$oldImage = imagecreatefromjpeg($tempFilePath); 
$newImage = imagecreatetruecolor($width, $height); 
$background = imagecolorallocate($oldImage, 255, 255, 255); 

imagefilledrectangle($newImage, 0, 0, $width, $height, $background); 

imagecopyresampled($newImage, $oldImage, $xpos, $ypos, 0, 0, $width, $height, $originalWidth, $originalHeight); 
imagedestroy($oldImage); 

imagejpeg($newImage, "/path/to/new.jpg", 90); 

imagedestroy($newImage); 

回答

0

最終沒有得到任何答案,所以對於那些有興趣在什麼我最終還是:

調查這多一點之後,我發現我最大的擔憂之一是有效的圖像編碼的內聯PHP和Ruby等EG文件:

<?php phpinfo(); 

我最終採取的解碼圖像數據,並給它imagecreatefromstring(),然後將圖像保存到一個臨時:在末尾下面的圖像目錄通過imagejpeg()

這似乎是從原始圖像數據中刪除任何編碼的PHP。此時我使用getimagesize()驗證了保存的圖像的圖像尺寸數據。假設在這一點上一切都是有效的,我將圖像移到了永久位置。

我改變了另一件事,而不是使用基於靜態字符串的文件名和microtime(),我使用了散列。

關於與代碼映像注入的關注,我發現這個鏈接是有幫助的: https://www.owasp.org/index.php/Unrestricted_File_Upload

我也發現這個其他SO後有用,至於總體思路走: Validating base64 encoded images

最後,下面這本書首先引起了我對圖像與代碼的關注: http://www.apress.com/9781430233183