Это безопасно? (PHP скачать скрипт) - PullRequest
2 голосов
/ 09 февраля 2011

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

header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header('Content-Length: ' . filesize("user_files/".$temp_actual));
header('Content-Disposition: attachment; filename="'.$filename."\"");
readfile("user_files/".$temp_actual);

$filename - это имя файла, которое они видят, а $temp_actual - это РЕАЛЬНОЕ имя файла на моем сервере. Очевидно, что над этим есть гора кода, чтобы предотвратить плохие вещи, но в основном пользователи должны иметь возможность загружать любой контент, который они загрузили. если они загружают файл .php, я действительно не хочу, чтобы он запускался на сервере, я хочу, чтобы он доставлялся им через принудительную загрузку (и им действительно нужно иметь возможность загружать любой тип файла).

Он работает так, как задумано, со всеми загружаемыми расширениями, но я просто хочу быть абсолютно уверен, что они не могут запускать файлы php или html на моем сервере.

Дополнительная информация

user_files находится в корне сайта, но .htaccess "deny from all" к каждому файлу в каталоге user_files добавляется файл .file вместо исходного расширения, исходное расширение заменяется, когда пользователь загружает свой файл (может быть, чуть выше).

Ответы [ 4 ]

3 голосов
/ 09 февраля 2011

Является ли папка user_files в корневом каталоге вашего сайта?Если это так, они могут загрузить php-файл и перейти к http://mysite.com/user_files/somefile.php и запустить код.Конечно, им нужно будет знать временное имя файла, но если вы еще этого не сделали, вы должны убедиться, что ваш веб-сервер настроен так, чтобы страницы не могли обслуживаться из этой папки (или переместить его за пределы корня документа).

2 голосов
/ 09 февраля 2011

Очистить имена файлов.Кто-то попытается загрузить .htaccess вместо вашего.

Даже если вы замените расширение на .file, кто-то попытается загрузить .htaccess\0.txt, который будет работать из-за ошибки .

Кто-то попытается .\301\250taccess (недопустимая последовательность UTF-8, которая может декодироваться до h).

Также кто-то попытается загрузить ../../../../../etc/shadow.

Если вы работаете в Windows, кто-то попробует .HTACCESS и ..\..\..\..\..\windows\system32\conf\sam.

Здесь важна часть "user_file/".$temp_actual: она предотвращает запуск имен файлов, похожих на URL .Возможно, добавьте комментарий на этот счет, чтобы он не подвергался рефакторингу.

Для полной уверенности и, если это удобно, кодируйте имена файлов в безопасные символы.Например, strtr(base64_encode($filename), '/', '_').

1 голос
/ 10 февраля 2011

Хорошо, так что ответ:

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

Слушайте, ребята, очевидно, что требуется дополнительная проверка, поэтому, пожалуйста, не отвечайте, что пользователь может загрузить xx.xx и перезаписать ваш xx или скачать xx из /../../../../, хотя я действительно ценю вашу помощь, я должен был немного переработать вопрос. Предположим, что загрузки и загрузки являются герметичными.

пример имени файла evil.php

  • скрипт загрузки принимает файл пользователя лишает всего, что не A-Za-Z0-9,! -_

  • затем удаляет расширение, сохраняет его и настоящее имя в базе данных # (и новое имя файла)

  • файл переименован, скажем, 12345.file и сохранен в user_files

  • user_files имеет CHMOD 700 и чтение .htaccess запрещается для всех

  • когда пользователь хочет получить свой файл, скрипт обращается к базе данных и получает реальное имя файла, старое имя файла и расширение, он сообщает браузеру пользователей, что имя файла - oldfilename.extension (зло. php) однако он все еще находится в файловой системе как 12345.file. Затем он устанавливает заголовки для загрузки и использует readfile () для чтения содержимого в браузере.

Чтобы проверить, что пользователи не могут получить мой сервер на PARSE php, я закомментировал заголовки, которые открывают окно загрузки файла сохранения, и просто использовал readfile (). В результате php был выгружен на страницу, но NOT PARSED . Дальнейшее тестирование с помощью eval () показало, что оно также не анализируется. Что наиболее полезно. =)

(и после прочтения немного следует изменить заголовки выше с application / force-download на application / octet-stream (правильный тип MIME).

Спасибо всем, кто ответил за всю вашу помощь - я надеюсь, что это может прояснить ситуацию для любого, кто наткнется на этот вопрос в будущем!

Мир!

0 голосов
/ 09 февраля 2011

Рассматривали ли вы изменение (добавление) расширения файла при загрузке?Скажем, myFile.php становится myFile.php.txt?

Вы по-прежнему можете отображать файлы (для целей загрузки) в формате .php, используя что-то вроде substr (), но расширение .txt сделает их бесполезными для реального запускана сервере - независимо от иерархии / расположения каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...