Блокировать загрузку исполняемых изображений (PHP)

Мне стало интересно, что пользователь пытается создать эксплойт через загрузку изображений аватара. Это было обнаружено, когда пользователь сообщил мне, что они получали уведомление от своего антивируса Norton, говорящего «HTTP Suspicious Executable Image Download». Это предупреждение ссылалось на изображение аватара пользователя. Я не думаю, что они на самом деле ничего не добились, чтобы украсть информацию или что-то в этом роде, но я предполагаю, что это возможно, если дыра остается открытой достаточно долго. Я использую PHP для загрузки файлов изображений, и я проверяю, загружен ли файл png, jpg, bmp или gif.

Это код, который проверяет, является ли это образом:

$allow_types = array('image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/png', 'image/bmp', 'image/bitmap'); if (in_array($this->tmp_image['type'], $this->allow_types)) { return true; } 

Solutions Collecting From Web of "Блокировать загрузку исполняемых изображений (PHP)"

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

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

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

При обработке загрузки файлов необходимо позаботиться о следующем.

  • Ограничьте количество байтов для загрузки на пользователя, чтобы ваш сервер не выходил из космоса.

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

  • Храните файлы выше вашего корня документа, чтобы они не были доступны напрямую.

  • Подавайте свои файлы через PHP-прокси-скрипт, пишите что-то вроде:

     $data = file_get_contents('/home/account/files/file.png'); header('Content-Type: image/png'); header('Content-Length: '. strlen($data)); header('X-Content-Type-Options: nosniff'); echo $data; 
  • Переименуйте загруженные файлы, чтобы иметь полное случайное имя без расширения. Если вам нужно сохранить имя файла (и расширение / тип), сохраните данные в базе данных.

  • Если необходимо, подавайте файлы только тогда, когда у пользователя есть разрешение на его использование.

  • Никогда не включайте / не выполняйте загруженные вами файлы. Это означает, что в PHP не требуется или не требуется. Нет тегов HTML-тегов или тегов стилей, включая их. Никаких команд Apache Include, включая их. И так далее.

  • Если это вообще возможно, откройте файлы из другого источника. Это устраняет проблемы происхождения, возникающие в основном в Flash. Использование другого порта, доменное имя или IP-адрес также прекрасны. Обслуживание из поддоменов опасно, и с IP-адресами реализация становится немного сложнее (т. Е. Вы не можете обслуживать файлы через домен, только через IP, и вы не можете обслуживать сайт через IP, а через домен).

  • Остерегайтесь LFI и RFI. Переименуйте имена файлов, прежде чем использовать имя файла в таких функциях, как fopen() , read() и т. Д., И при необходимости проверьте / дезинформируйте любые значения каталога.

Самое простое решение – перепробовать изображение. Получите простое изображение манипулирования lib (GD) и загрузите повторно сохранение изображения, оно должно эффективно лишить любой исполняемый контент или просто сбой, если изображение просто переименовано exe.

используйте imagecreatefromjpeg (и другие imagecreatefrom *), чтобы проверить, что переданные данные являются фактическим изображением. exe не пройдет.

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

см. эту ссылку http://www.bitrepository.com/how-to-validate-an-image-upload.html