PHP File Upload, безопасный? - PullRequest
       0

PHP File Upload, безопасный?

1 голос
/ 20 октября 2010

Это то, что я хочу, чтобы пользователь мог:

  • Загрузить ЛЮБОЙ файл на сервер (вложение) в папку загрузки
  • Уметь загрузить его впоследствии

Итак, я создал этот каталог со следующим .htaccess

Allow from all
DirectoryIndex .x
php_flag engine off
Options -Indexes
Options -ExecCGI
AddType text/plain .html .htm .shtml .php .php3 .php5 .phtml .phtm .pl .py .cgi
ForceType applicaton/octet-stream

У меня вопрос, это безопасно?

Ответы [ 3 ]

6 голосов
/ 20 октября 2010

Я бы хотел сказать: нет

Это должно быть более безопасно, если вы отказываете в доступе всем и управляете загрузкой через скрипт, который доставляет файлы. Кроме того, вы должны переименовать файлы, чтобы, например, там. никто не размещает свой собственный htaccess или что-то еще. Оригинальные имена файлов, которые вы можете сохранить в БД.

Почему: вы никогда не узнаете, что произойдет в будущем, некоторые файлы впоследствии могут стать исполняемыми, в другом месте вы разместите небезопасный скрипт, который позволяет пользователям включать эти загруженные файлы и т. Д.

4 голосов
/ 20 октября 2010

Я также согласен с Dr.Molle в том, что вы должны переименовывать файлы и отправлять их динамически.

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

С помощью mod_xsendfile вместо вывода файла через PHP вы можете просто отправить заголовки XSendFile:

<?php
    header('Content-Disposition: attachment;filename=originalname.txt');
    header('X-Sendfile: /path/to/file.txt');
?>

Таким образом, вы можете хранить все файлы вне корневого каталога и, следовательно, совершенно недоступны для внешнего мира. Вам вообще не придется беспокоиться о .htaccess.

Если ваш хост позволяет вам устанавливать новые модули Apache, вам понадобится установить apxs (вероятно, так и будет). Если он не установлен, вам нужно пересобрать Apache с включенным apxs. По моему опыту, если вы можете управлять этим, оно того стоит. XSendFile экономит так много хлопот.

0 голосов
/ 20 октября 2010

Я согласен, что было бы намного лучше скачать их через специальный скрипт. Но если это невозможно, сделайте две вещи:

  1. Если вы хотите, чтобы пользователи могли загружать файлы, вы можете добавить вложение HTTP-заголовок ответа Header set Content-disposition "attachment" который заставит браузер загружать файл вместо его рендеринга. Тем не менее, вы должны убедиться, что файлы не будут доступны через другие потенциальные уязвимости, такие как включение файлов.
  2. Запретить выполнение для каталога загрузки с chmod -R a-x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...