Безопасность при загруке файлов

МиротворецФорма загрузки файлов на сервер — это одно из самых слабых мест в защите сайта и должно быть прикрыто с многократным запасом. Думаю не нужно объяснять читателю, что может сделать злоумышленник, если зальёт к вам на сайт PHP-шелл под видом безобидной картинки.

Content-Type
=======================
Первое что можно проверить при загрузке файла — это Content-Type. Это могло бы помочь нам отсечь неправильный тип файлов. Однако помнить, что Content-Type формируется клиентской стороной, а значит может быть подделана, поэтому нам это не годится.

Расширение файла
=======================
Второй способ убедиться, что передаваемый файл действительно изображение — проверить расширение файла. На самом деле это довольно действенный метод. Даже если злоумышленник подсунет нам чистый PHP файл, только с расширением JPG, то всё равно сервер не будет его интерпретировать как PHP файл.

Однако раз в сто лет и палка стреляет. Аксакалы говорят, что видели конфигурации серверов, где даже GIF проходят через интерпретатор PHP. А ещё, на сервере может найтись include-уязвимость, и тогда вредный файл может быть запущен через include. Поэтому надо обезопаситься ещё сильнее.

Getimagesize
=======================
Можно попробовать получить информацию о нём с помощью функции getimagesize. Если это НЕ изображение, то функция выдаст искажённый результат.

Если сделаем так, то злоумышленник не сможет залить откровенный PHP-скрипт под видом картинки. Но этот способ можно обойти. Например можно запихнуть PHP код в служебную область картинки.

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

Размер изображения
=======================
Остаётся ещё два приёмчика. Можно например принудительно изменять размер изображения. При этом изображение будет полностью перегенерировано, и вся зловредная информация скорее всего исчезнет.

.htaccess
=======================
И ещё один приём. Как осиновый кол в сердце вампира. Можно ведь использовать .htaccess и запретить исполнение скриптов в каталоге загрузки!

Вот такой код:

php_flag engine 0
AddType "text/html" .php .cgi .pl .fcgi .fpl .phtml .shtml .php2 .php3 .php4 .php5 .asp .jsp

UPD:
Лучше запретить пользователям просмотривать содержимое каталога загрузки. Чем меньше потенциальный взломщик знает — тем лучше! Добавляем в .htaccess

Options -Indexes

Резюме
=======================
Это всё что я нашёл. Есть ощущение, что при соблюдении всех вышеупомянутых правил должна быть хорошая защищённость.

Может у кого-то ещё есть какие-то секретики?

Ссылки
=======================
Все вышеупомянутые приёмы хорошо описаны в этих постах на хабре

Безопасность при загруке файлов: Один комментарий

  1. Ptah

    Да,да, меня кстати так недавно дефейснули :)
    Заменили index.php и загрузили картинку через upload.
    Надо бы посмотреть, что я не так сделал? :)

Комментарии запрещены.