filepath.Clean本身不防路径穿越,仅做标准化:它将./a/../b变为b、////tmp//./../etc/passwd变为/etc/passwd,但不拒绝输入、不校验越界;必须配合URL解码、白名单前缀校验及符号链接/TOCTOU防护才安全。

filepath.Clean 本身不防路径穿越,只做标准化
很多人以为调用 filepath.Clean 就能拦住 ../../etc/passwd,其实它只是把路径“理顺”:把 ./a/../b 变成 b,把 ////tmp//./../etc/passwd 变成 /etc/passwd。它不拒绝任何输入,也不校验是否越界——filepath.Clean("../../etc/passwd") 返回 /etc/passwd,你若直接拼进 os.Open,就等于把整个系统目录暴露了。
它也不是字符串清洗函数:filepath.Clean("%2e%2e%2fetc%2fpasswd") 原样返回,因为没解码;filepath.Clean("C:\Windows\System32\drivers\etc\hosts") 在 Linux 上也照常返回,毫无拦截能力。
- 它只处理路径语义:归一化分隔符、折叠
.和..、消除重复斜杠 - 它不处理 URL 编码、空字节(