- Change all `import hono` to `import meiseayoung.hono` in code and docs - Ensure compatibility with VPM installation via `v install meiseayoung.hono`
189 lines
4.9 KiB
V
189 lines
4.9 KiB
V
import meiseayoung.hono
|
|
|
|
fn main() {
|
|
println('=== 测试输入验证和路径安全 ===')
|
|
|
|
println('1. 路径安全验证测试')
|
|
|
|
// 测试安全路径
|
|
safe_paths := [
|
|
'test.txt',
|
|
'images/photo.jpg',
|
|
'docs/readme.md',
|
|
'assets/style.css'
|
|
]
|
|
|
|
for path in safe_paths {
|
|
result := hono.validate_file_path(path, hono.default_path_validation_options()) or {
|
|
println(' ❌ 安全路径被拒绝: $path - $err')
|
|
continue
|
|
}
|
|
println(' ✅ 安全路径通过: $path -> $result')
|
|
}
|
|
|
|
// 测试危险路径
|
|
dangerous_paths := [
|
|
'../etc/passwd',
|
|
'..\\windows\\system32',
|
|
'/etc/shadow',
|
|
'C:\\Windows\\System32',
|
|
'test<script>.html',
|
|
'file|pipe.txt',
|
|
'test?.txt',
|
|
'file*.log'
|
|
]
|
|
|
|
for path in dangerous_paths {
|
|
result := hono.validate_file_path(path, hono.default_path_validation_options()) or {
|
|
println(' ✅ 危险路径被正确拒绝: $path - $err')
|
|
continue
|
|
}
|
|
println(' ❌ 危险路径未被拒绝: $path -> $result')
|
|
}
|
|
|
|
println('2. 文件哈希验证测试')
|
|
|
|
// 测试有效哈希
|
|
valid_hashes := [
|
|
'5d41402abc4b2a76b9719d911017c592', // MD5 of "hello"
|
|
'098f6bcd4621d373cade4e832627b4f6', // MD5 of "test"
|
|
'e99a18c428cb38d5f260853678922e03' // MD5 of "abc123"
|
|
]
|
|
|
|
for hash in valid_hashes {
|
|
result := hono.validate_file_hash(hash) or {
|
|
println(' ❌ 有效哈希被拒绝: $hash - $err')
|
|
continue
|
|
}
|
|
println(' ✅ 有效哈希通过: $hash -> $result')
|
|
}
|
|
|
|
// 测试无效哈希
|
|
invalid_hashes := [
|
|
'', // 空哈希
|
|
'invalid', // 太短
|
|
'5d41402abc4b2a76b9719d911017c592x', // 包含非十六进制字符
|
|
'5d41402abc4b2a76b9719d911017c59', // 太短
|
|
'5d41402abc4b2a76b9719d911017c5922' // 太长
|
|
]
|
|
|
|
for hash in invalid_hashes {
|
|
result := hono.validate_file_hash(hash) or {
|
|
println(' ✅ 无效哈希被正确拒绝: "$hash" - $err')
|
|
continue
|
|
}
|
|
println(' ❌ 无效哈希未被拒绝: "$hash" -> $result')
|
|
}
|
|
|
|
println('3. 文件名验证测试')
|
|
|
|
// 测试有效文件名
|
|
valid_filenames := [
|
|
'document.pdf',
|
|
'image_001.jpg',
|
|
'data-file.json',
|
|
'report_2023.xlsx'
|
|
]
|
|
|
|
for filename in valid_filenames {
|
|
result := hono.validate_filename(filename) or {
|
|
println(' ❌ 有效文件名被拒绝: $filename - $err')
|
|
continue
|
|
}
|
|
println(' ✅ 有效文件名通过: $filename -> $result')
|
|
}
|
|
|
|
// 测试无效文件名
|
|
invalid_filenames := [
|
|
'', // 空文件名
|
|
'CON.txt', // Windows 保留名
|
|
'file<>.txt', // 危险字符
|
|
'file|pipe.txt',
|
|
'test?.doc',
|
|
'a'.repeat(300) // 太长的文件名
|
|
]
|
|
|
|
for filename in invalid_filenames {
|
|
result := hono.validate_filename(filename) or {
|
|
println(' ✅ 无效文件名被正确拒绝: "$filename" - $err')
|
|
continue
|
|
}
|
|
println(' ❌ 无效文件名未被拒绝: "$filename" -> $result')
|
|
}
|
|
|
|
println('4. 文件大小验证测试')
|
|
|
|
max_size := 10 * 1024 * 1024 // 10MB
|
|
|
|
// 测试有效大小
|
|
valid_sizes := ['1024', '5242880', '10485760'] // 1KB, 5MB, 10MB
|
|
|
|
for size_str in valid_sizes {
|
|
result := hono.validate_file_size(size_str, max_size) or {
|
|
println(' ❌ 有效大小被拒绝: $size_str - $err')
|
|
continue
|
|
}
|
|
println(' ✅ 有效大小通过: $size_str -> ${result} bytes')
|
|
}
|
|
|
|
// 测试无效大小
|
|
invalid_sizes := ['', '0', '-1024', '20971520'] // 空, 0, 负数, 20MB(超过限制)
|
|
|
|
for size_str in invalid_sizes {
|
|
result := hono.validate_file_size(size_str, max_size) or {
|
|
println(' ✅ 无效大小被正确拒绝: "$size_str" - $err')
|
|
continue
|
|
}
|
|
println(' ❌ 无效大小未被拒绝: "$size_str" -> ${result}')
|
|
}
|
|
|
|
println('5. 分片索引验证测试')
|
|
|
|
max_chunks := 100
|
|
|
|
// 测试有效索引
|
|
valid_indices := ['0', '50', '99']
|
|
|
|
for index_str in valid_indices {
|
|
result := hono.validate_chunk_index(index_str, max_chunks) or {
|
|
println(' ❌ 有效索引被拒绝: $index_str - $err')
|
|
continue
|
|
}
|
|
println(' ✅ 有效索引通过: $index_str -> $result')
|
|
}
|
|
|
|
// 测试无效索引
|
|
invalid_indices := ['', '-1', '100', 'abc']
|
|
|
|
for index_str in invalid_indices {
|
|
result := hono.validate_chunk_index(index_str, max_chunks) or {
|
|
println(' ✅ 无效索引被正确拒绝: "$index_str" - $err')
|
|
continue
|
|
}
|
|
println(' ❌ 无效索引未被拒绝: "$index_str" -> $result')
|
|
}
|
|
|
|
println('6. 安全内容类型检测测试')
|
|
|
|
test_files := [
|
|
'document.pdf',
|
|
'image.jpg',
|
|
'style.css',
|
|
'script.js',
|
|
'data.json',
|
|
'unknown.xyz'
|
|
]
|
|
|
|
for file in test_files {
|
|
content_type := hono.get_safe_content_type(file)
|
|
println(' 文件: $file -> Content-Type: $content_type')
|
|
}
|
|
|
|
println('✅ 输入验证和路径安全测试完成!')
|
|
println(' 优化效果:')
|
|
println(' - 统一的安全验证模块,避免代码重复')
|
|
println(' - 增强的路径遍历攻击防护')
|
|
println(' - 严格的输入验证(哈希、文件名、大小等)')
|
|
println(' - 文件类型白名单机制')
|
|
println(' - 可配置的安全选项')
|
|
} |