# 创建测试环境
import tempfile
import os
def test_path_validator():
"""测试路径校验器"""
# 创建临时目录作为base_path
with tempfile.TemporaryDirectory() as tmpdir:
base = os.path.join(tmpdir, "agent")
os.makedirs(base)
# 创建一些文件用于测试
safe_dir = os.path.join(base, "data")
os.makedirs(safe_dir)
with open(os.path.join(safe_dir, "safe.txt"), "w") as f:
f.write("safe content")
# 在base外创建一个要保护的文件
protected = os.path.join(tmpdir, "protected.txt")
with open(protected, "w") as f:
f.write("protected content")
# 创建符号链接(Linux)
try:
symlink = os.path.join(base, "link_to_protected")
os.symlink(protected, symlink)
except:
symlink = None
validator = PathValidator(base_path=base)
# 测试用例
test_cases = [
# (输入, 应该成功, 描述)
("data/safe.txt", True, "合法的相对路径"),
("./data/safe.txt", True, "带./的合法路径"),
("data/../data/safe.txt", True, "包含..但仍在范围内"),
("../../../etc/passwd", False, "相对路径穿越"),
("..%2f..%2fetc%2fpasswd", False, "URL编码穿越"),
("..%252f..%252fetc%252fpasswd", False, "双重URL编码穿越"),
("data/../../../../../../etc/passwd", False, "多层相对穿越"),
]
for user_path, should_succeed, description in test_cases:
try:
result = validator.validate(user_path)
if should_succeed:
print(f"✓ {description}: {user_path} -> {result}")
else:
print(f"✗ {description}: {user_path} 本应被阻止,但成功了")
except ValueError as e:
if not should_succeed:
print(f"✓ {description}: {user_path} 正确被阻止 ({e})")
else:
print(f"✗ {description}: {user_path} 本应成功,但被拒绝了 ({e})")
# 运行测试
test_path_validator()