filepath.clean不是安全过滤器,仅做路径语义压缩:合并重复分隔符、消除./、解析../,不校验存在性、不防越界、不处理编码或非法字符,必须配合解码、统一分隔符、白名单校验等步骤才能保障安全。

filepath.Clean不是字符串清洗函数,它只做路径语义压缩
很多人把 filepath.Clean 当成“防遍历的字符串过滤器”,这是根本性误解。它不删字符、不校验、不拒绝任何输入——filepath.Clean("../../etc/passwd") 返回 "../etc/passwd",filepath.Clean("%2e%2e%2fetc%2fpasswd") 甚至原样返回(因为没解码)。它只是把 a/./b/../c 变成 a/c,仅此而已。
真正需要的是「清洗」:剥离控制字符、统一编码、标准化分隔符、再做语义校验。这三步缺一不可。
- 先调
url.PathUnescape解码一次(且仅一次),否则%2e%2e直接绕过所有后续检查 - 立刻检查是否含
