У меня есть форма, которая отправляет строку в мое приложение Flask при публикации формы. Строка - это путь к файлу, поэтому я хочу убедиться, что она не содержит ничего противного, например ../../../etc/passwd
. Werkzeug, который использует Flask, имеет удобную функцию под названием secure_filename
, которая удаляет неприятные вещи из имен файлов. К сожалению, при заполнении полного пути, например templates/example.html
, он преобразует /
в _
, поэтому мы получаем templates_example.html
.
Поэтому представляется разумным разделить путь на уровни, поэтому я отправляю templates
и example.html
по отдельности, а затем снова соединяю их вместе на сервере. Это прекрасно работает, за исключением того, что путь может быть сколь угодно глубоким. Я мог бы просто связать вместе dir1/dir2/dir3/dir4
и надеяться, что никто не пойдет глубже, чем dir4
, но это кажется глупым.
Как правильно обрабатывать проверку путей неизвестной глубины? Подтвердить по-другому? Отправить данные по-другому? Кодировать путь по-другому, а затем декодировать его на сервере?