Я использую инструмент загрузки изображений на основе пользователя для своего веб-сайта. Система должна позволять любым пользователям загружать только файлы JPEG и PNG. Я, конечно, беспокоюсь о безопасности, и поэтому мне интересно, как многие умные люди, чем я, испытывают следующие проверки на возможность загрузки:
1) Первый белый список допустимых расширений файлов в PHP, чтобы разрешить только PNG, png, jpg, JPG и JPEG. Извлеките расширение пользовательского файла с помощью функции, например:
return end(explode(".", $filename));
Это должно помочь запретить пользователю загружать что-то вредоносное, например .png.php. Если это пройдет, перейдите к шагу 2.
2) Запустите функцию php getimageize() в файле TMP. Через что-то вроде:
getimagesize($_FILES['userfile']['tmp_name']);
Если это не возвращает false, продолжайте.
3) Убедитесь, что файл .htaccess помещен в каталог uploads, так что любые файлы в этом каталоге не могут анализировать файлы PHP:
php_admin_value engine Off
4) Переименуйте файл пользователя в заранее определенное. То есть.
$filename = 'some_pre_determined_unique_value' . $the_file_extension;
Это также поможет предотвратить SQL-инъекцию, поскольку имя файла будет единственной определяемой пользователем переменной в любых запросах.
Если я выполняю вышеописанное, насколько уязвим для атаки, я все еще? Прежде чем принимать файл, я должен надеяться, что 1) допустим только jpg и png, 2) Проверено, что PHP говорит, что это допустимое изображение, 3) отключил каталог, в котором находятся изображения из исполняемых файлов .php, и 4) переименовал файл пользователя в нечто уникальный.
Спасибо,