Загрузка файлов

загрузка файлов

Сайт может позволять посетителям загружать свои файлы с последующим отображением на своих страницах. Это могут быть, к примеру, изображения в формате JPEG. Важно ограничить типы загружаемых файлов, чтобы вместо картинки не был бы загружен исполняемый файл.

При загрузке файла PHP в переменной $_FILES['userfile']['type'] возвращает mime-тип файла, для JPEG-изображения это будет image/jpeg. Может показаться, что проверка этого типа достаточна для уверенности в том, что загружено именно изображение. Также встречается идея пытаться читать файл изображения функциями getimagesize или imаgecreatefromjpeg. Однако тип файла здесь определяется на основе содержания, так что правильное JPEG-изображение, сохраненное с расширением .php, будет определено как image/jpeg. А называться будет xxxxx.php. Веб-сервер же, принимающий решение об обработчике (handler) для того или иного файла, смотрит именно на расширение. Злоумышленник берет корректную картинку, приписывает к ней в конец (или в EXIF-данные) php-скрипт, и сервер его исполняет, мы взломаны.

Таким образом, контролировать для обеспечения безопасности следует именно расширение файла, а проверки через определение mime-type и через попытку открыть файл функцией getimagesize имеют смысл только для контроля того, что вместо картинки не будет загружен мусор, безвредный, но картинкой не являющийся.

Также можно хранить файлы в директории, недоступной для непосредственного доступа посетителей веб-сервера, а отдавать их контент через скрипт. Это, однако же, увеличивает нагрузку на сервер и требует реализации базовой функциональности веб-сервера (выдачи даты последнего изменения и реакции на условные запросы типа "If-Modified-Since", выдачи корректных mime-type и поддержки докачки).

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


Источник: http://www.captcha.ru

Рекомендуем



Аудит безопасности - Зачем это надо? Вы можете обратиться к нам независимо от того хотите вы создать простой сайт-визитку или большой портал с множеством функций и возможностей для пользователей или же если вы например только хотите проверить скрипты вашего сайта на отсутствие ошибок


Register Globals Если программист не следит за начальной инициализацией переменных, может возникнуть уязвимость, иллюстрируемая простым примером:


Full path disclosure (раскрытие полного пути) Косвенно используется для определения имени пользователя, типа операционной системы, запущенной на сервере, доступности возможных папок