2014-02-04 4 views
2

У меня есть загруженная в файл система в моем проекте php.Безопасный файл для загрузки

Что делать при загрузке:

1) Проверьте расширение файла и тип файла мим.

2) Если расширение и типа MIME разрешено типов, я сохраняю файл вне public_html каталога, а затем, я даю возможность пользователям, скачать файл так:

 if (file_exists($file_path)) { 
      header('Content-Description: File Transfer'); 
      header('Content-Type: some mime type'); 
      header('Content-Disposition: attachment; filename=somefilename'); 
      header('Content-Transfer-Encoding: binary'); 
      header('Expires: 0'); 
      header('Cache-Control: must-revalidate'); 
      header('Pragma: public'); 
      header('Content-Length: ' . filesize($file_path)); 
      readfile($file_path); 
    } 

Вопрос: это шаги для загрузки файла , безопасны или нет? Если нет, что может сделать дополнительно, для повышения безопасности при загрузке файла?

Спасибо.

ответ

2
  • Проверка типа MIME не помогает вообще, поскольку эта информация может быть создана.
  • Это зависит от того, как вы проверяете расширение файла и что вы делаете с этой информацией. Попробуйте использовать «белый список» для расширения файла вместо «черного списка».
  • Перемещение его за пределы public_html - хорошая идея, также попробуйте переименовать файл и просто добавьте расширение к нему.
  • Будьте предельно осторожны со сжатыми файлами, вы можете закончить работу с некоторой zipbomb или что-то в этом роде.
  • Будьте осторожны с файлом, если вы собираетесь выполнять с ним какую-то операцию, например, изменение размеров изображений. Помните, что вы имеете дело с пользовательским вводом, который будет взаимодействовать с вашим кодом, и его можно было бы использовать для использования вашего кода (например, уязвимости выполнения кода).

Также попробуйте прочитать this article, это даст вам полезную информацию, которую вы, возможно, раньше не имели.

+1

+1 Да, вы можете переименовать все файлы в «безопасное» расширение, такое как '.txt', чтобы предотвратить их случайное выполнение на сервере и сохранить исходное имя файла в базе данных или, тем не менее, сохранить фактические двоичные данные в база данных, которая определенно предотвратит случайное выполнение. Вы также можете получить доступ к файлам для загрузки через другой домен ('download.example.com'), который предотвратит любые [XSS] (https://www.owasp.org/index.php/Cross-site_Scripting_ (XSS)) атакует ваш сайт, так как любой код JavaScript будет защищен Политикой одного и того же происхождения. – SilverlightFox

Смежные вопросы