2016-02-15 1 views
1

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

Использование: index.php? Имя_файла = myhash.txt & хэш = 8145c8f6d42fda2c3cfdd1d091bcb331

$filename = isset($_GET["filename"]) ? $_GET["filename"] : "md5.txt"; 
$hash = (isset($_GET["hash"]) && preg_match('/^[a-f0-9]{32}$/', $_GET["hash"])) ? $_GET["hash"] : ""; 

header("Content-type: text/plain"); 
header("Content-Disposition: attachment; filename=$filename"); 
echo $hash; 

Моя проблема заключается в $filename используется в заголовке, который каждый может изменить. Является ли это уязвимостью безопасности?

+0

Да. Это называется атакой включения файла. –

+2

@RichardTheobald - Нет, это не так. Это было бы проблемой только в том случае, если код использовал имя файла, предоставленное пользователем для доступа к файловой системе сервера ... что это не так. – Quentin

+0

@Quentin Правда, это не техническая атака включения файла, поскольку файл загружается, а не включается/отображается, но конечный результат по существу такой же, как и атака LFI: можно загрузить копию любого файла, который пользователь Apache имеет доступ к. http://hakipedia.com/index.php/Local_File_Inclusion –

ответ

3

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

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


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

Учитывая язык программирования, в котором программа могут быть записаны с использованием только символов, которые соответствуют [a-f0-9] (что означает отсутствие пробелов), а программа может быть записана на 32 из этих символов, тогда злоумышленник может создать URL-адрес, который, как представляется, находится на вашем сайте (и, следовательно, заслуживает доверия), что вызывает файл под названием something.xyz для загрузки. (Для значения xyz, который зарегистрирован как расширение файла для скриптов, написанных на этом языке.) Это приведет к загрузке программы злоумышленника туда, где пользователь может дважды щелкнуть по ней и выполнить ее.

Это очень маловероятный случай для начала, и современные ОС отлично подходят для загрузки загружаемых файлов, требуя «Вы уверены, что хотите выполнить это?». так что это серьезный вопрос.

Чтобы быть параноидальным, вы можете ограничить имя файла тегами с .txt или .md5 расширениями.


Специальные символы могли быть вопрос, но я не могу думать ни о том, что будет риск в безопасности. Если, например, в имя файла была введена новая строка, то современные версии PHP, скорее всего, выкинули бы что-то по строкам:

Предупреждение: заголовок может содержать не более одного заголовка, обнаружена новая строка в /Users/david/tmp/hfjkljiwe/index.php в строке 4

... и не позволяет сценарию выводить заголовок содержимого.

Не запускайте old versions of PHP, установите установленные исправления безопасности!


С другой стороны, браузеры, вероятно, принять имя файла, что файловая система они пишут, чтобы собирается бросить шаткий над нет.


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

+0

Хороший ответ. Единственным другим риском является использование старой версии PHP, когда возможна вставка заголовка: http://stackoverflow.com/a/11363523/413180 – SilverlightFox

+0

@SilverlightFox - Спасибо за этот указатель, я включил его в ответ. – Quentin

+0

Спасибо @Quentin за отличный ответ и SilverlightFox за предупреждение о более старых версиях PHP. Введение в заголовке было моей главной заботой, так что хорошо учиться PHP предотвращает появление новых строк в заголовке. Я также добавил дополнительные ограничения на имя файла, как вы сказали, просто для того, чтобы быть более безопасным. – Elias

0

Насколько я могу судить, вы теоретически в порядке, чтобы это сделать; так как вы никогда не получаете доступ к файлам на своем сервере, никто не может сделать ничего отрицательного на вашем сервере. Однако потенциально можно указать недопустимое имя файла для своей ОС, и я не совсем уверен, что произойдет. Учитывая, что он будет открывать диалог загрузки в любом случае, кажется, что безопаснее позволять им вводить имя файла в то время, а не позволять им вводить его заранее.

+0

В любой системе это может быть проблемой, если файл впоследствии обрабатывается программой, которая неправильно обрабатывает имена файлов (и их много), например. index.php? filename = afile.txt% 3Brm% 20-rf% 20 /. MSWindows особенно плох в этом отношении, но поскольку оболочка настолько ограничена, я думаю, что худшим из них может быть запись на устройство. – symcbean

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