Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Загрузка изображения на сайт, как защитить сервер?

#php


Как защитить сервер, на котором находится сайт и форум, с поддержкой загрузки собственных
аватар и вставки изображений в комментарии?

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


Ответы

Ответ 1



Всем известно, что сам по себе вирус - это набор байтов, абсолютно безвредный, пока не запущен на исполнение в соответствующем окружении. Из окружений на РНР веб-сервере обычно доступны два - CGI и PHP. Для CGI достаточно не загружать изображения в папку, которая предназначена для исполняемых файлов. Для РНР же защита сводится к тому, чтобы Не пропускать файлы с расширением php. Это просто, за исключением одного нюанса* Не инклюдить в свои пхп скрипты что попало. Это правило гораздо важнее и шире, чем просто загрузка изображений. Если оно не соблюдается, то и никаких картинок на сервер заливать не надо. Если же наш код всегда точно значет, какой именно файл он инклюдит, и подсунуть ему со стороны ничего невозможно, то и картинка с пхп кодом тоже будет безопасной. -- Нюанс. Веб-сервер апач в дефолтной конфигурации исполняет файлы вида script.php.jpg как php файлы.

Ответ 2



Лучшая защита - это правильно настроенный веб-сервер. К примеру, если полностью запретить (в случае Apache) или просто не разрешать (в случае nginx) запуск PHP-скриптов из папки /uploads/ (или как она там у вас называется) - то при загрузке файлов на сервер можно не проверять вообще ничего (ну, разве что на /../ проверить). Если вы используете PHP-фреймворки с паттерном Front Controller (когда все запросы проходят через index.php) - то надо вообще запретить выполнять любые PHP-скрипты кроме index.php UPD Запрет исполнения скриптов через htaccess: SetHandler default-handler Теперь любые файлы в этой директории будут обрабатываться обработчиком по умолчанию, если я ничего не перепутал.

Ответ 3



Просто считайте изображение одной из библиотек работы с изображениями, а затем - отрисуйте программно. Пример для изображения в формате JPEG с использованием GD: $img = imagecreatefromjpeg('upload/avatar.jpg'); //Считываем изображение из загруженного //файла imagejpeg($img); //Рисуем считанное изображение imagejpeg($img, 'profile/avatar.jpg'); //Сохраняем считанное изображение в файл imagedestroy($img); //Освобождаем переменную При этом, все спрятанные в изображении сторонние файлы будут утеряны, и останется только удалить изображение-исходник из upload/. Также следует помнить про правильно настроенные права: chmod('profile/avatar.jpg', 0600); //НЕ исполняемый файл, запись и чтение только для владельца В совокупности с запуском сервера от имени отдельного системного пользователя: Даже если в изображении был исполняемый файл, он не сможет быть запущен, так как это прямо запрещено правами файла. Кроме того, сторонние программы не смогут изменить изображение после загрузки, так как права на это есть только у пользователя, от имени которого был создан файл. Не стоит выводить через imagejpeg уже прошедшие обработку изображения из profile/, - этим вы генерируете избыточную нагрузку на сервер, дальше можно обходиться обычным HTML. В крайнем случае, - сохраните дату последнего изменения файла, после установки прав, и проверяйте, не изменилась ли она.

Комментариев нет:

Отправить комментарий