go路径安全需三步:规范化(filepath.clean)、白名单校验(strings.hasprefix)、最小权限打开(os.o_nofollow);单独正则或ext检查会遗漏遍历、空字节、竞态等风险。

Go 中无法仅靠字符串规则 100% 判定路径“合法”,必须结合规范化 + 白名单 + 最小权限打开三步走;单独用正则或 filepath.Ext 都会漏掉路径遍历、空字节、竞态等关键风险。
filepath.Clean 不等于安全,只是标准化第一步
filepath.Clean 会把 "../../etc/passwd" 变成 "/etc/passwd",但它不拒绝、不报错、也不检查是否越界。它只做一件事:消除 .、..、重复分隔符,返回语义最简的等效路径。
- 必须在
filepath.Clean后立刻用strings.HasPrefix(cleaned, allowedRoot)做白名单校验,否则 Clean 反而帮攻击者“理顺”了恶意路径 - Windows 下
filepath.Clean("C:\temp\..\user")返回"C:\user",大小写保持原样,比对时建议统一转小写或用filepath.VolumeName提取盘符再判断 - 如果原始输入含
