<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.