[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Безопасность при загрузке изображений
Страницы: 1, 2, 3, 4
andrey888
"Белый Тигр" Спасибо, пойду по похожему пути !


_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
killer8080
Цитата (andrey888 @ 13.02.2012 - 21:46)
Вывод - эта функция совсем не панацея ..

Совершенно верно, для безопасности getimagsize() совершенно бесполезна.
При загрузке изображений, нужно соблюдать несколько простых правил
1 если имя файла задает пользователь, нужно контролировать расширение. Допускать загрузку файлов только с определенным расширением;
2 контролировать набор символов в имени файла. Вот пример как делать нельзя

$types = array('jpg','jpeg','gif','png');
if(in_array(strtolower(pathinfo($_FILES["picture"]["name"], PATHINFO_EXTENSION)), $types))
move_uploaded_file ( $_FILES["picture"]["tmp_name"], $uploaddir.$_FILES["picture"]["name"] );

несмотря на то что контролируется расширение, при таком раскладе хакер может перезаписать любой графический файл на сайте, просто задав имя файла ../images/logo.gif. Конечно контроль над сайтом через эту дырку он не получит, но для мелкого пакостного дефейса, вполне достаточно. Для защиты от этой уязвимости будет достаточно прогонять имя файла через basename().
3 если делается ресайз картинки, то скрипты по определению, не пройдут.

В общем если контролируется расширение, то серверной стороне, скрипты в картинке ничем не угрожают, клиентской стороне на сегодняшний день вроде то же, ie6 практически никто не пользуется.
inpost
killer8080
"скрипты в картинке ничем не угрожают"
Кроме уязвимости в include. В связке с include можно будет запустить выполнение PHP кода, находящегося в файле с расширением .jpg. Пробовал у себя smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (inpost @ 14.02.2012 - 11:36)
Кроме уязвимости в include. В связке с include можно будет запустить выполнение PHP кода, находящегося в файле с расширением .jpg. Пробовал у себя

А на кой картинку инклюдить? smile.gif
inpost
killer8080
Я говорю про include-inj , где в адресной строке можно написать, какой файл подключается smile.gif Это тоже считается уязвимостями сайта.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (inpost @ 14.02.2012 - 12:27)
Я говорю про include-inj , где в адресной строке можно написать, какой файл подключаетсяЭто тоже считается уязвимостями сайта.

А ну если так, то да, ты прав.
andrey888
Через адресную строку никаких инклудов у меня нет , только в самом коде есть инклуды на определенные файлы (как пример include 'frg.php';) ... это как я понимаю не сулит никакой угрозой.
- Буду разрешать загружать только jpg, jpeg .

"killer8080"
Если я правильно тебя понял то вот в этой статье http://irbis-team.com/15/13/2 при проверки расширения файла нужно так же добавить прогонку через basename() ??

И насчет ресайза , можно самый легкий пример в студию ? как я понимаю готовой фунции по ресайзу в пхп нет ?


_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
inpost
andrey888
Почему нет? Всё есть, библиотека GD, смотри там smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (andrey888 @ 14.02.2012 - 13:26)
Если я правильно тебя понял то вот в этой статье http://irbis-team.com/15/13/2 при проверки расширения файла нужно так же добавить прогонку через basename() ??

В той статье, Николай упустил из виду регистр, это нужно исправить
$file_extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);

на это
$file_extension = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));

А насчет basename(), она отсечет возможные подставы с манипуляцией каталогом загрузки, собственно об этом я уже написал.
Цитата (andrey888 @ 14.02.2012 - 13:26)
И насчет ресайза , можно самый легкий пример в студию ? как я понимаю готовой фунции по ресайзу в пхп нет ?

Свернутый текст
function img_resize($src, $dest, $max_side, $quality = 75, &$error){

if(!file_exists($src)){
$error = "file_not_exist";
return false;
}

$size = getimagesize($src);
if(!$size){
$error = "getimagesize_failure";
return false;
}

// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));

// определяем функцию преобразования в соотвествии с форматом
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)){
$error = "not_supported_format";
return false;
}

// ширина и высота выходного фото
$width = $size[0] >= $size[1] ? $max_side : floor($max_side * ($size[0] / $size[1]));
$height = $size[0] <= $size[1] ? $max_side : floor($max_side * ($size[1] / $size[0]));

if(!$i_src = @$icfunc($src)){
$error = "corrupted_file";
return false;
}
$i_dest = imagecreatetruecolor($width, $height);

imagecopyresampled($i_dest, $i_src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);

$img = imagejpeg($i_dest, $dest, $quality);
imagedestroy($i_src);
imagedestroy($i_dest);

if($img){
if(file_exists($dest)) chmod($dest, 0775);
$error = false;
return true;
}
else{
$error = "imagejpeg_failure";
return false;
}

}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.