filepath.Clean不能单独用于安全校验,因其仅做路径字符串归一化,不拒绝越界路径、不处理空字节、不解析符号链接、不校验盘符或根目录限制;必须组合规范化、白名单比对(如filepath.Rel或strings.HasPrefix)和os.O_NOFOLLOW打开文件三步闭环。

filepath.Clean 不是安全校验,只是路径标准化的第一步。单靠它或正则表达式无法防止路径遍历、空字节、符号链接绕过等攻击——必须组合三步:规范化 → 白名单比对 → 最小权限打开。
为什么 filepath.Clean 不能单独用于安全校验
filepath.Clean 只做语义归一化:把 "./a/../b" 变成 "b",把 "../../etc/passwd" 变成 "/etc/passwd"(Linux)或 "C:\etc\passwd"(Windows)。它不拒绝、不报错、也不检查是否越界。
常见错误现象:filepath.Clean("../secret") 返回 "../secret",直接拼进 os.Open 就可能读到根目录外文件;Windows 下 filepath.Clean("C:\temp\..\user") 返回 "C:\user",但若没校验盘符,就可能跨盘访问。
- 它不处理空字节(