Безопасная загрузка файлов PHP - PullRequest
0 голосов
/ 18 марта 2009

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

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

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

Ответы [ 6 ]

3 голосов
/ 18 марта 2009

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

2 голосов
/ 19 марта 2009

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

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

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

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

1 голос
/ 18 марта 2009

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

1 голос
/ 18 марта 2009

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

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

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

0 голосов
/ 19 марта 2009

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

0 голосов
/ 18 марта 2009

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

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

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

...