Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Самая надежная проверка upload
 
 автор: Blizard   (10.08.2009 в 11:13)   письмо автору
 
 

Загружаю картинки, на сервере принимаю и смотрю формат:


$file_type = $_FILES['logo']['type'];
$ttype = explode ("/",$file_type);
$mytype = $ttype[1];


т.е. $mytype мне нужно чтоб было строго картинка, какая проверка в данном случае будет самой эффективной, которая не пропустит даже txt файлик например сохраненный как mytxt.gif ?

  Ответить  
 
 автор: Blizard   (10.08.2009 в 12:30)   письмо автору
 
   для: Blizard   (10.08.2009 в 11:13)
 

Возможно я некорректно задаю вопрос...

На сколько хорошо делать так:


if(($mytype!="gif")&&($mytype!="jpg")&&($mytype!="png")) exit("неверный формат");


Как проверить txt файл сохраненный как txtfile.gif ?

  Ответить  
 
 автор: Саня   (10.08.2009 в 12:59)   письмо автору
 
   для: Blizard   (10.08.2009 в 12:30)
 

Можно применить функцию imagecreatefrom* на файл. И если вернётся валидный ресурс, то файл дйствительно картинка.

  Ответить  
 
 автор: neadekvat   (10.08.2009 в 13:10)   письмо автору
 
   для: Саня   (10.08.2009 в 12:59)
 

А с какими параметрами, интересно, картинка будет создаваться?
Тогда уж проще запросить, скажем, ширину картинки. И, если вернется, значит картинка, если ошибка будет - знач фигня какая-то

  Ответить  
 
 автор: Trianon   (10.08.2009 в 13:15)   письмо автору
 
   для: neadekvat   (10.08.2009 в 13:10)
 

А если ширина вернется, а картинка - нет? :)

  Ответить  
 
 автор: Visavi   (10.08.2009 в 13:22)   письмо автору
 
   для: Blizard   (10.08.2009 в 11:13)
 

по-моему лучше проверять через

<?php
$size 
getimagesize($_FILES['file']['tmp_name']);

//там вернет массив какое расширение у этого файла, mime типы, размер сторон и другое

//дополнительно gif к примеру можно проверить так

$file file_get_contents($_FILES['file']['tmp_name']);
$string substr($file03);

if (
$string=='GIF'){..
// то есть читаем первые символы в самом файле хотя это наверно лишнее.
?>

  Ответить  
 
 автор: Trianon   (10.08.2009 в 13:23)   письмо автору
 
   для: Visavi   (10.08.2009 в 13:22)
 

>$file = file_get_contents($_FILES['file']['tmp_name']);
>$string = substr($file, 0, 3);

Э-э...
Вы хорошо подумали?
чтобы проверить сигнатуру, красная цена которой 6 байт, Вы будете весь файл в память тащить?

На конюшне пороть за такие решения.

  Ответить  
 
 автор: Slo_Nik   (10.08.2009 в 13:25)   письмо автору
 
   для: Blizard   (10.08.2009 в 11:13)
 

так не должно работать.
получается, что ты делаешь проверку
"если mytype не равно gif И если mytype не равно jpg И ...", тут надо использовать " || " (ИЛИ) вместо " && ".
потом надо всё таки писать не " gif ", а " image/gif " и так далее.
вот пару вариантов как можно сделать

<?php
if(substr($_FILES['filename']['type']),0,5) == 'image'){
//продолжаем загрузку
}
else{
// выводим сообщение с предупреждением
}

//или можно сделать так


//извлекаем из имени файла расширение
$ext strtolower(strrchr($_FILES['filename']['name'], " . "));
// массив разрешённых расширений
$exttentions = array('.jpg','.gif');
// проверка входитли данное расширение в список допустимых
if(in_array($ext$exttentions)){
//продолжаем загрузку
}
else{
// выводим предупреждение
}
?>
 

  Ответить  
 
 автор: Blizard   (10.08.2009 в 13:42)   письмо автору
 
   для: Slo_Nik   (10.08.2009 в 13:25)
 

Нет, с логикой как раз в моем примере все верно, если ставить (или) то все условия никогда не будут истинны одновременно.
Я забыл сказать что по контексту картинка грузится довольно приличных размеров, поэтому сделал так

$size = $_FILES["logo"]["size"];
if(($mytype!="gif")&&($mytype!="jpg")&&($mytype!="png")&&($mytype!="jpeg")&&($mytype!="GIF")&&($mytype!="JPG")&&($mytype!="PNG")&&($mytype!="JPEG")||($size<50))
exit("Вы пытаетесь загрузить файл с запрещенным форматом! К загрузке допустимы только форматы jpg, gif и png");

Вроде работает как нужно, потестировал. Как сделать чтобы в прверке можно было писать только нижний регистр? А то если грузить PNG формат, а в проверке оставить только png то выбивает ошибку.

  Ответить  
 
 автор: neadekvat   (10.08.2009 в 13:54)   письмо автору
 
   для: Blizard   (10.08.2009 в 13:42)
 

Я не верю, что ваш код работает.
Стоит кучу "И", это значит, что все значения должны быть истины. Как вы этого добились?
И потом, у вас либо расширение должно быть вот эти все сразу, либо размер меньше 50. Видимо, поэтому и работает скрипт.
И потом, если 50 - это мегабайты, то возникает два вопроса: сделали ли вы так, чтобы можно было загружать 50 мб (по умолчанию, по-моему, намного меньше можно файлы загружать), и что за картинки такие сумсшедшие?

Ах ты ж черт, != не увидел.
В любом случаи, по логике, размер файла должен быть больше 50, а не меньше.
Чертовщина какая-то. Не дай бог кому-нибудь после вас с этим кодом работать.

  Ответить  
 
 автор: Trianon   (10.08.2009 в 13:56)   письмо автору
 
   для: neadekvat   (10.08.2009 в 13:54)
 

>Я не верю, что ваш код работает.
>Стоит кучу "И", это значит, что все значения должны быть истины. Как вы этого добились?

Выведите промежуточные значения - увидите, что с логикой всё в порядке.
Если не считать утерянной возможности загружать gif и png короче 50 байт.

  Ответить  
 
 автор: neadekvat   (10.08.2009 в 14:01)   письмо автору
 
   для: Trianon   (10.08.2009 в 13:56)
 

Да, я уже дополнил пост.

  Ответить  
 
 автор: Blizard   (10.08.2009 в 14:06)   письмо автору
 
   для: neadekvat   (10.08.2009 в 14:01)
 

Расчет не в мегабайтах, а в байтах, картинки размером 400x100 уж точно будут больше 50 байт, а вот файлы почти всегда будут меньше, да и врядли хакер сразу станет лить огромный файл, начнет с <? echo("Hello world"); ?> =))

  Ответить  
 
 автор: neadekvat   (10.08.2009 в 14:08)   письмо автору
 
   для: Blizard   (10.08.2009 в 14:06)
 

Если этот "хакер" впервые в жизни открыл учебник по программированию - то да, начнет он именно с этого.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования