2015-12-14 5 views
3

У меня есть API, который принимает данные изображения с кодировкой base64 и должен будет декодировать данные, сохранить файл изображения, а затем создать эскиз с этого изображения.Проблемы с защитой от 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

Смежные вопросы