Безопасность загрузки файлов PHP - сохранение исходного имени файла - PullRequest
0 голосов
/ 29 марта 2012

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

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Имя файлов может раскрыть потенциально конфиденциальную информацию.Некоторые компании / люди используют разные соглашения об именах для документов, поэтому вы можете в итоге:

  • Имя автора (court-order-john.smith.doc)
  • Название компании (чувствительно-information-предприимчивое.doc)
  • Дата создания файла (письмо.2012-03-29.pdf)

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

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

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

1 голос
/ 29 марта 2012

Это зависит от того, где вы храните имя файла. Если вы сохраняете имя в базе данных в строго типизированной переменной, то кодирование HTML перед отображением на веб-странице проблем не вызовет.

0 голосов
/ 23 ноября 2018

Хотя это старый вопрос, он удивительно высок в списке результатов поиска при поиске «имен файлов безопасности», поэтому я хотел бы расширить существующие ответы:

Да, это почти наверняка уязвимость.

Есть несколько возможных проблем, с которыми вы можете столкнуться, если попытаетесь сохранить файл, используя его оригинальное имя файла :

  • имя файла может быть зарезервированным или специальным именем файла.Что произойдет, если пользователь загрузит файл с именем .htaccess, который скажет веб-серверу проанализировать все файлы .gif как PHP, а затем загрузит файл .gif с комментарием GIF <?php /* ... */ ?>?
  • имени файламожет содержать ../.Что произойдет, если пользователь загрузит файл с именем ../../../../../etc/cron.d/foo?(Этот конкретный пример должен быть обнаружен системными разрешениями, но знаете ли вы все места, из которых ваша система читает файлы конфигурации?)
    • , если пользователь, на котором работает веб-сервер (назовем егоwww-data) неправильно настроен и имеет оболочку, как на счет ../../../../../home/www-data/.ssh/authorized_keys?(Опять же, этот конкретный пример должен быть защищен самим SSH (и, возможно, папкой не существует), поскольку для файла authorized_keys требуются особые права доступа к файлу; но если ваша система настроена для ограничения доступапо умолчанию права доступа к файлу (сложно!), тогда это не будет проблемой.)
  • имя файла может содержать x00 байт или управляющие символы.Системные программы могут не реагировать на них должным образом - например, простой ls -al | cat (не то, что я знаю, почему вы хотите это выполнить, но более сложный сценарий может содержать последовательность, которая в конечном итоге сводится к этому) может выполнять команды.
  • имя файла может оканчиваться на .php и может быть выполнено, как только кто-то попытается загрузить файл.(Не попробуйте занести в черный список расширения .)

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

Кроме того, вы можете свернуть имя файла самостоятельно, когда вы сохраните файл и для использования в URL, который люди используют для загрузки файла (хотя, если это скрипт для обслуживания файлов, вам все равно следует избегать, чтобы люди указывали здесь имена файлов, чтобы никто не загружал ваши ../../../../../etc/passwd или другие файлы, представляющие интерес), но сохраняйте исходное имя файла в базе данных для отображения где-либо.В этом случае вам нужно беспокоиться только об SQL-инъекции и XSS, и это означает, что другие ответы уже рассмотрены.

...