Как сделать безопасный скрипт загрузки файлов в php? - PullRequest
9 голосов
/ 29 ноября 2009

Я проверяю файл на его расширение и тип mime - могу ли я что-нибудь еще сделать, чтобы сделать загрузку файлов более безопасной?

это для аватара (поэтому все изображения находятся в одной папке). я думал об использовании htaccess, чтобы запретить любое выполнение php, только если какой-то php файл нашел его там. что ты думаешь?

Ответы [ 2 ]

19 голосов
/ 29 ноября 2009

Ни расширение файла, ни тип mime не могут обеспечить вам 100% безопасности при работе с файлом изображения. Но если вы не собираетесь выполнять файл (например, с помощью include ()), это не проблема, и вам не нужно проверять код PHP или что-то еще. Единственное нарушение безопасности, которое можно себе представить, используя поддельный файл изображения, - это то, что использует движок рендеринга браузера. Это невозможно эффективно защитить от серверной части и является обязанностью поставщика браузера.

Итак, если вы используете is_uploaded_file() и move_uploaded_file() при обработке выгрузки, у вас все будет хорошо, по крайней мере, на фронте формата изображения. Обязательно прочитайте нижеприведенный пост @ bobince и перейдите по ссылке, где содержится много полезной информации о других аспектах безопасности при работе с файлами.

Однако вы можете обеспечить максимальную безопасность, скопировав изображение в новый контейнер изображений, используя GD's imagecopy . Это приведет к удалению любой ID3 и другой информации заголовка, содержащейся в файле, и, вероятно, уничтожит любые попытки эксплойта (GD, вероятно, захлебнется таким файлом и вернет ошибку). Конечно, это работает только для GIF, JPEG и PNG, и вы можете столкнуться с некоторыми проблемами, такими как проблемы альфа-канала и цветового профиля.

17 голосов
/ 29 ноября 2009
  1. Никогда не используйте пользовательские имена файлов вообще; составляют новые, такие как «случайное число» .jpeg. «Санировать» имена файлов сложнее, чем вы думаете, особенно если приложение должно быть в состоянии работать на сервере Windows.

  2. Для изображений используйте функцию PHP getimagesize, чтобы определить тип файла изображения, а не смотреть на крайне ненадежное имя файла и представления mimetype. Запретить загрузку, которая не обрабатывается как изображения.

  3. Для файлов, предназначенных для загрузки, используйте заголовок Content-Disposition: attachment, чтобы прекратить анализировать IE для содержимого HTML и отображать его в браузере.

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

Безопасная функция загрузки файла - hard . Дополнительные обсуждения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...