Найти - Пользователи
Полная версия: Защита от обхода каталога
Начало » Python для экспертов » Защита от обхода каталога
1
odnochlen
Сабж. Как сделать, чтобы переданный путь не поднимался выше определенного каталога?
reclosedev
Если правильно понял:
import os
 
def validate_path(path, working_path="."):
    real_working_path = os.path.realpath(working_path)
    real_user_path = os.path.realpath(path)
    working_parts = real_working_path.split(os.path.sep)
    user_parts = real_user_path.split(os.path.sep)
    return (len(user_parts) >= len(working_parts) and
            all(wp == up for wp, up in zip(working_parts, user_parts)))
 
print validate_path("")
print validate_path(".")
print validate_path("tst")
print validate_path("tst/../")
print validate_path("/tmp/asdf", "/tmp")
print validate_path("/tmp/asdf/../", "/tmp")
print
print validate_path("../")
print validate_path("tst/../../")
print validate_path("/etc/passwd")
print validate_path(r"c:\windows")
print validate_path("/tmp1/asdf", "/tmp")
print validate_path("/tmp/../", "/tmp")
slav0nic
os.chroot
odnochlen
slav0nic
os.chroot
os.chroot(path)

Change the root directory of the current process to path. Availability: Unix.
И мне менять надо не для программы, а для для путей, которые передает пользователь.

Идея проверять на .. пойдет?

Да, передаваемый путь будет относительным.

reclosedev, в принципе то, что надо. В принципе. А проверенного решения нет? А то безопасность все-таки.
doza_and
odnochlen
Идея проверять на .. пойдет?
Вопрос в том чтобы в глубине не было символьных ссылок вверх.
odnochlen
На каталоги или на файлы? Можно было бы считать, что тот, кто туда поместил ссылку - ССЗБ.

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

os.path все равно с реальными файлами не работает, только с путями.
reclosedev
odnochlen
А проверенного решения нет?
Можно поискать в веб-фреймворках.
odnochlen
Идея проверять на .. пойдет?
В Werkzeug так и сделано.
odnochlen
os.path все равно с реальными файлами не работает, только с путями.
os.path.realpath() символические ссылки заменяет, например.
odnochlen
reclosedev
os.path.realpath() символические ссылки заменяет, например.
Интересно, надо проверить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB