Хотя это старый вопрос, он удивительно высок в списке результатов поиска при поиске «имен файлов безопасности», поэтому я хотел бы расширить существующие ответы:
Да, это почти наверняка уязвимость.
Есть несколько возможных проблем, с которыми вы можете столкнуться, если попытаетесь сохранить файл, используя его оригинальное имя файла :
- имя файла может быть зарезервированным или специальным именем файла.Что произойдет, если пользователь загрузит файл с именем
.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, и это означает, что другие ответы уже рассмотрены.