[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Какие есть дыры в этих скриптах загрузки картинок?
volodumir
Первый скрипт:
<form enctype="multipart/form-data" action="upload.php" method="POST">
<p>
<input
type="hidden" name="MAX_FILE_SIZE" value="20971520">
<input
type="file" name="photo"><br>
<input
type="submit" value="Загрузить">
</p>
</form>

Второй скрипт:

<?php

$blacklist = array(".php", ".phtml", ".php3", ".php4");

foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['photo']['name'])) {
echo "Хакер!!!!!!!";
exit;
}
}


$type = getimagesize($_FILES['photo']['tmp_name']);

$size = $_FILES['photo']['size'];

if ($type[2] == 2&$size < 20971520)
{

$source = $_FILES['photo']['tmp_name'];
$target = 'photo' . $_FILES ['photo']['name'];
$foto = imagecreatefromjpeg ($_FILES['photo']['tmp_name']);
imagejpeg ($foto, "photo.jpg", "100");
imagedestroy ($foto);

}
elseif ($type[2] == 1&$size < 20971520)
{

$source = $_FILES['photo']['tmp_name'];
$target = 'photo' . $_FILES ['photo']['name'];
$foto = imagecreatefromgif ($_FILES['photo']['tmp_name']);
imagejpeg ($foto, "photo.jpg", "100");
imagedestroy ($foto);

}
elseif ($type[2] == 3&$size < 20971520)
{

$source = $_FILES['photo']['tmp_name'];
$target = 'photo' . $_FILES ['photo']['name'];
$foto = imagecreatefrompng ($_FILES['photo']['tmp_name']);
imagejpeg ($foto, "photo.jpg", "100");
imagedestroy ($foto);

}
else
echo "Ваша фотография занимает больше 20 мегабайт, или вы загружаете не JPG, GIF или PNG !!!!!";

?>



Я немножко усовершенствовал свой предыдущий скрипт. Меня интересуют уезвимости моего скрипта и методы их решения.
Как заменить проверку на наличие в черном списке

$blacklist = array(".php", ".phtml", ".php3", ".php4");

foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['photo']['name'])) {
echo "Хакер!!!!!!!";
exit;
}
}



на белый список. То есть если файл не gif, jpg, png - exit?



Спустя 5 часов, 3 минуты, 3 секунды (30.08.2010 - 21:00) Белый Тигр написал(а):
Зачем вам проверка по такому списку?
Цитата
$blacklist = array(".php", ".phtml", ".php3", ".php4");

Нельзя так делать. Человек может придумать ещё кучу дополнительных расширений на которых вы проколитеcь. shtml например. Хоть в вашем варианте (перегон всего в jpeg) это не прокатит, всёже лучше к такой практике не прибегать.
Сделайте лучше следующим образом.
$source = $_FILES['photo']['tmp_name'];
$target = 'photo' . $_FILES ['photo']['name']

и
imagejpeg ($foto, "photo.jpg", "100");
imagedestroy ($foto);

вынесите вообще за общую if-конструкцию. Оставьте в ней лишь
$foto = imagecreatefrom* ($_FILES['photo']['tmp_name']);

И перед тем как сохранить фото в jpeg, проверьте, не false ли находится в $foto. Если вам подсунут текст или что-то ещё, но не картинку, там будет именно false.
Быстрый ответ:

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