Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Безопасность загрузчика файлов


Автор: PROme 8.6.2005, 00:31
Нужно сделать возможность загрузки картинки на сайт любым желающим. Можно узнать, какие есть меры по защите (скажем, чтобы вместо картинки не подсунули какую-нить бяку)... можно ли на php определить, является ли загружаемый файл картинкой или чем-то другим, только с измененным разширением?

Автор: Black 8.6.2005, 01:11
PROme
вот какие меры предпринимаю лично я:

Код

// проверяем размер файла
 if($_FILES['userfile']['size']<3072) { echo 'Вы загрузили файл размером меньше, чем 3 Кб. С трудом верится, что это настоящий графический файл.'; exit; }

 if($_FILES['userfile']['size']>2097152) { echo 'Вы загрузили файл размером больше, чем 2 Мб. С трудом верится, что это настоящий графический файл.'; exit; }

// проверяем тип загруженного файла
if(!ereg("^image/(jpeg|gif|jpg|png)$", $_FILES['userfile']['type'])) { echo "Что-то странное вы загрузили на сервер. Можно загружать изображения в формате: gif, jpg, png."; exit; }

// получаем высоту и ширину файла
 $size = GetImageSize($_FILES['userfile']['tmp_name']);
 // проверяем чтобы размеры картинки были больше, чем 100x100
 if($size[0]<150 or $size[1]<150) { echo 'Слишком маленькая картинка меньше 150x150'; exit; }

 // открываем файл
 if(!$img=@imageCreateFromJpeg($Dir.$NameImg))
 {
  if(!$img=@imageCreateFromPng($Dir.$NameImg))
  {
  if(!$img=@imageCreateFromGif($Dir.$NameImg)) { echo 'Ошибка при открытии графического файла'; exit; }
  }
 }



Если вернут 'Ошибка при открытии графического файла', то уж точно что-то левое загрузили. А вообще не стоит боятся, если .php-файл загрузят на сервер. Все равно мы проверяем разрешение. Даже, если и загрузят, то в виде name.php.jpg, а сервер этот файл картинкой считает и не отдаст на обработку PHP.

P/S: возможно кто-то посчитает некие функции, которые я здесь привел не правильными, например, почему размер не может быть меньше 3кб и размеры картинки меньше 100 px.

Это просто я код из своей галлереи выдрал. А в нее нельзя маленькие картинки загружать. Только фотографии. Поэтому такие проверки.

Также мне интересно выслушать мнения других.

Автор: Opik 8.6.2005, 01:42
getimagesize:
Цитата
If accessing the filename image is impossible, or if it isn't a valid picture, getimagesize() will return FALSE and generate an error of level E_WARNING.

соответственно
Код

 // открываем файл
 if(!$img=@imageCreateFromJpeg($Dir.$NameImg))
 {
  if(!$img=@imageCreateFromPng($Dir.$NameImg))
  {
  if(!$img=@imageCreateFromGif($Dir.$NameImg)) { echo 'Ошибка при открытии графического файла'; exit; }
  }
 }

не нужно

Автор: PROme 8.6.2005, 01:54
ну да getimagesize не узнает размер картинки, не открыв ее smile
а в общем все ясно и понятно, спасибо smile
ЗЫ: да, ничего особо страшного не будет если что-то левое грузанут, но лучше перестрохаваться, тем более это дополнительных ресурсов считай не и потребует... smile

Автор: Opik 8.6.2005, 10:52
PROme
Цитата
ЗЫ: да, ничего особо страшного не будет если что-то левое грузанут

зря ты так думаешь...)

Автор: Black 8.6.2005, 11:59
Opik
Цитата
зря ты так думаешь...)

аргументируй фразу smile

Автор: Mal Hack 8.6.2005, 12:04
Цитата(PHP @ 8.6.2005, 12:59)
аргументируй фразу smile

Загрузят PHP скрипт smile Будет весело..

При загрузке надо смотреть как и рсширение файла, так и является ли он этим самым файлом. Те.е картинку ты правильно проверял выш через getomagesize..

Автор: Smak 2.7.2005, 19:39
PHP-DIRECTOR, у тебя в скрипте проверка размера файла идёт уже после его закачки, то есть файл загружается в tmp каталог, потом смотрится его размер... но если юзер начнёт заливать фильм или ещё какой либо большой файл. То файл будет загружаться! а потом только над ним будут происходить действия (естественно скрипт выведет на экран "неправильный формат"), это очень не удобно! поэтому размер надо проверять в форме, я пытался разабраца, но что то у меня не чего не вышло...

Может кто знает хорошо HTML, помогите!

Автор: Opik 2.7.2005, 19:46
Smak
во первых HTML тут непричем... как минимум JS.
Во вторых проверки лучше делать всё же на серверной стороне.

Автор: Black 2.7.2005, 20:13
Smak
фильм не закачает никто :-) потому что стоит ограничение на закачку файла (не более 2 Мб).

Конечно, в php.ini можно увеличить размер закачиваемого файла, но это, как правило, никто не делает.

Цитата
размер надо проверять в форме, я пытался разабраца, но что то у меня не чего не вышло...


и не выйдет. Для этого надо иметь большие права, чтобы иметь возможность работы с файлами (смотреть их размер на пользователькой машине). Не один браузер такого не позволит. Разве что IE, если добавить сайт в надежные сайты и использовать ActiveX.

Автор: Smak 2.7.2005, 21:29
ясна! я про php.ini совсем забыл.... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)