我试图检查给定的用户提供的字符串是否是一个简单的文件/文件夹名。我计划使用os.path.join()将该名称连接到预设的根目录,但我希望检测并禁止试图遍历该根目录之外任何位置的路径。
例如,值为“track001.mp3”的字符串很好,它将解析为“root_dir/track001.mp3”。但是,应当发现并禁止:
'../other_root_dir/'
'/etc'
'/'
'~'
'subdir/inner_file'
发布于 2017-07-04 20:06:57
我建议您创建路径字符串,就像通常假设用户行为一样(例如,传递“简单”或符合路径名称)。然后我将使用os.path.expandvars
和os.path.normpath
来获取实际的路径名。最后,我将检查以确保实际路径名驻留在根目录中。类似于:
from os.path import expandvars, normpath, join
ROOT_DIR = 'root_dir'
user_path = 'some_path'
test_path = normpath(expandvars(join(ROOT_DIR, user_path)))
expected_prefix = normpath(ROOT_DIR)
if not test_path.startswith(expected_prefix):
raise ValueError(f'Invalid path "{user_path}"') # python3.6 f-string.
https://stackoverflow.com/questions/44916777
复制