2010-10-19 3 views
1

Это то, что я хочу, пользователь сможет:PHP Загрузка файлов, безопасная?

  • загрузить любой файл на сервер (приложение) для закачки FOLDER
  • быть в состоянии загрузить его впоследствии

Так что я создал этот режур со следующим .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 

Мой вопрос в том, что это безопасно?

+1

Возможно, стоит отметить это как «apache», поскольку файлы .htaccess для веб-сервера, а не как PHP. –

+1

Итак, что мешает кому-то загружать .php-файл и выполнять его? – rook

ответ

6

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

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

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

+0

Итак, я переименовываю файл в MD5 ('test'), например, и доставляю загрузку с помощью скрипта, размещаю файлы outsite WWW и .htaccess их «Deny from all»? – Simon

+0

Да, это было бы намного безопаснее.Кроме того, вы должны убедиться, что ни один из ваших собственных сценариев на сервере никогда не сможет включить один из этих файлов (это невозможно сделать через .htaccess, вам нужно настроить open_basedir на путь каталога, который не содержит загрузочный файл, папка). Если вы поместите каталог за пределами DOCUMENT_ROOT, вам не нужен .htaccess, каталог в любом случае недоступен через HTTP –

0

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

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

Я также согласен с 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 с включенными apx. По моему опыту, если вы можете справиться с этим, это того стоит. XSendFile экономит много проблем.

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