Безопасная загрузка файлов PHP

Я пытаюсь разработать модуль загрузки файлов на нашем новом сайте, который позволит вам загружать любой файл на наши серверы. Загруженный файл загружается в /files, в котором есть следующий .htaccess для предотвращения выполнения пользователями, т. е. файл .php:

<Files *.*>
ForceType applicaton/octet-stream
</Files>

Это вызывает окно загрузки браузера (по крайней мере, в FF и Safari), но безопасно ли предположить, что файл не будет запущен на сервере с использованием этого метода? Если нет, то как бы вы реализовали такое решение?


person Mads Mobæk    schedule 18.03.2009    source источник


Ответы (6)


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

Типа, но это зависит от того, какие еще директивы присутствуют в вашем конфиге; возможно, есть другие правила, позволяющие запускать файлы PHP. Если единственный способ включить PHP — это указать обработчику PHP тип файла, это должно остановить выполнение PHP.

Однако остановка выполнения PHP — это лишь одна из ваших забот. Если люди загружают файлы с активным содержимым, например HTML или Flash  — даже если в типе файла указано, что это невинное изображение — — они могут получить контроль над сеансами других пользователей на вашем сайте с помощью межсайтового скриптинга (XSS). См. раздел Не позволяйте людям загружать вредоносные файлы PHP через формы, чтобы обсудить это.

Интерфейс «download.php», который использует Content-Disposition, чтобы всегда запускать окно загрузки, в сочетании с хранением файлов под именами, не предоставленными пользователем, такими как «1234.dat», намного безопаснее.

person bobince    schedule 19.03.2009
comment
В то время как Content-Disposition: вложение запускает загрузку во всех распространенных браузерах, Opera, Safari, Konquerer по-прежнему будет открывать его в контексте веб-сайта, поэтому файл имеет доступ к файлу cookie сеанса. - person Hendrik Brummermann; 24.11.2010

Я думаю, что безопаснее всего ограничить 100% веб-доступ к каталогу и иметь сценарий, подобный download.php, через который вы передаете идентификатор файла, который затем извлекает соответствующий файл и выводит его в браузер. Тем не менее, я почти уверен, что то, что у вас есть, будет работать и безопасно.

person Paolo Bergantino    schedule 18.03.2009

Я думаю, вы действительно хотите этого:

<Directory /path/to/files>
    SetHandler default-handler
</Directory>

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

person David Z    schedule 18.03.2009

Поддерживая ответ Паоло, переместите каталог файлов из доступного пути. Затем вы можете написать скрипт download.php, используя HTTP_Download от PEAR. модуль для обслуживания файлов.

person Community    schedule 18.03.2009

Я согласен с Паоло, его способ более безопасный. Всегда существует проблема, связанная с тем, что кто-то использует ваши PHP-файлы для выполнения загруженного файла. Плохой пример:

include_once("/modules/".$_GET["module"].".php");

Где кто-то прошел в module=../Files/exploit

person St. John Johnson    schedule 18.03.2009

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

person eliego    schedule 19.03.2009