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
os.chroot(path)И мне менять надо не для программы, а для для путей, которые передает пользователь.
Change the root directory of the current process to path. Availability: Unix.
odnochlenВопрос в том чтобы в глубине не было символьных ссылок вверх.
Идея проверять на .. пойдет?
odnochlenМожно поискать в веб-фреймворках.
А проверенного решения нет?
odnochlenВ Werkzeug так и сделано.
Идея проверять на .. пойдет?
odnochlenos.path.realpath() символические ссылки заменяет, например.
os.path все равно с реальными файлами не работает, только с путями.
reclosedevИнтересно, надо проверить.
os.path.realpath() символические ссылки заменяет, например.