filepath.Clean仅规范化路径,不校验合法性;防目录穿越需用filepath.Abs+strings.HasPrefix比对根目录;os.Stat是唯一能确认路径可访问性的标准方式。

Go 中 filepath.Clean 不能代替路径合法性校验
filepath.Clean 只做规范化(如 ../ 折叠、重复 / 合并),不检查路径是否存在、是否越界或是否符合 OS 约束。比如 filepath.Clean("../etc/passwd") 返回 "../etc/passwd",但它显然可能逃出预期根目录——这不属于“合法”路径的范畴。
所谓“合法”,需按使用场景明确定义:是能被 os.Open 打开?还是必须落在某个白名单根目录下?或是仅语法上无空字符、控制符、NUL?
- 若目标是「防止目录穿越」,必须结合根目录做绝对路径比对,不能只信
Clean - 若目标是「避免非法文件名」,Windows 下需拒绝
<code>:*?"<>|,Linux 下主要防 NUL(