Форум сайта python.su
Сабж. Как сделать, чтобы переданный путь не поднимался выше определенного каталога?
Офлайн
Если правильно понял:
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")
Офлайн
os.chroot
Офлайн
slav0nic
os.chroot
os.chroot(path)И мне менять надо не для программы, а для для путей, которые передает пользователь.
Change the root directory of the current process to path. Availability: Unix.
Отредактировано odnochlen (Ноя. 6, 2012 15:26:30)
Офлайн
odnochlenВопрос в том чтобы в глубине не было символьных ссылок вверх.
Идея проверять на .. пойдет?
Офлайн
На каталоги или на файлы? Можно было бы считать, что тот, кто туда поместил ссылку - ССЗБ.
Смысл такой. Есть каталог с файлами и подкаталогами, откуда юзер может качать файлы через наш скрипт. Надо, чтобы он не мог подняться выше.
os.path все равно с реальными файлами не работает, только с путями.
Отредактировано odnochlen (Ноя. 6, 2012 21:39:44)
Офлайн
odnochlenМожно поискать в веб-фреймворках.
А проверенного решения нет?
odnochlenВ Werkzeug так и сделано.
Идея проверять на .. пойдет?
odnochlenos.path.realpath() символические ссылки заменяет, например.
os.path все равно с реальными файлами не работает, только с путями.
Офлайн
reclosedevИнтересно, надо проверить.
os.path.realpath() символические ссылки заменяет, например.
Офлайн