Проверьте безопасную загрузку изображений

Я хочу загрузить изображения на сервер из окна браузера.
Я использую эту функцию для загрузки изображений. Изображения загружаются библиотекой GD.
Каково ваше мнение об этом коде?
Я хочу знать, есть ли еще способ загрузить вредоносный файл?

<?php
function imageUpload($name, $thumb = false, $max_size = 5242880, $height = null, $width = null, $T__height = 100, $T__width = 100)
{
if(!isset($_FILES[$name]))
{
return false;
}

$allowedTypes = array('image/gif', 'image/jpeg', 'image/png', 'image/wbmp');
$image = &$_FILES[$name];

if ($image['error'] == 0 && in_array($image['type'], $allowedTypes) && $image['size'] <= $max_size)
{
$in = '';
switch ($image['type'])
{
case 'image/gif':
$in = 'imagecreatefromgif';
break;
case 'image/jpeg':
$in = 'imagecreatefromjpeg';
break;
case 'image/png':
$in = 'imagecreatefrompng';
break;
case 'image/wbmp':
$in = 'imagecreatefromwbmp';
break;
}

if ($in == '')
{
return false;
}

$src = $in($image['tmp_name']);
$height = ($height == null || $height <= 0 ? imagesy($src) : $height);
$width = ($width == null || $width <= 0 ? imagesx($src) : $width);

$dst = imagecreatetruecolor($width, $height);
imagecopyresized($dst, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));

$fileName = '';
do
{
$fileName = makeHash(mt_rand(0, mt_getrandmax()) . microtime(true), $image['tmp_name']);
}
while(file_exists('/image/' . $fileName . '.jpg') || ($thumb && file_exists('/thumb/' . $fileName . '.jpg')));
if ($fileName == '')
{
return false;
}

imagejpeg($dst, '/image/' . $fileName . '.jpg', 75);

if ($thumb)
{
$dst = imagecreatetruecolor($T__width, $T__height);
imagecopyresized($dst, $src, 0, 0, 0, 0, $T__width, $T__height, imagesx($src), imagesy($src));
imagejpeg($dst, '/thumb/' . $fileName . '.jpg', 75);
}

imagedestroy($src);
imagedestroy($dst);

return $fileName . '.jpg';
}
}
?>

-2

Решение

Прежде всего, не следует полагаться на mimetypes для каких-либо механизмов безопасности, поскольку злоумышленник имеет полный контроль над этим полем (он может загрузить файл .php с типом изображения / gif, который пройдет эти проверки). Затем, если они включают нулевой байт в имени файла %00 или же \00 тогда можно обойти условие, которое добавляет расширение .jpg к изображению, как это evil.php\00.jpg так что к тому времени, когда файл попадет на диск, он будет просто evil.php. Трудно полностью оценить ваш код, не видя все функции, потому что в зависимости от того, что они все делают, могут открыться уязвимости. (например, неясно, где хранятся их файлы, что их вызывает, загружает и т. д.).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]