1 回答

TA贡献1797条经验 获得超6个赞
我相信你可以使用filepath.Rel
它(并检查它是否返回一个不以 开头的值..
)。
Rel 返回一个在词法上等效于 targpath 的相对路径,当它通过中间分隔符连接到 basepath 时。也就是说,Join(basepath, Rel(basepath, targpath)) 等价于 targpath 本身。成功时,返回的路径将始终相对于 basepath,即使 basepath 和 targpath 不共享任何元素。如果 targpath 不能相对于 basepath 或者如果需要知道当前工作目录来计算它,则会返回错误。Rel 根据结果调用 Clean。
filepath.Rel
还调用filepath.Clean
其输入路径,解析任何.
s 和..
s。
Clean 通过纯词法处理返回与 path 等效的最短路径名。它迭代地应用以下规则,直到无法进行进一步处理:
将多个分隔符元素替换为一个。
消除每一个。路径名元素(当前目录)。
消除每个内部 .. 路径名元素(父目录)以及它之前的非 .. 元素。
消除以根路径开头的 .. 元素:即,假设 Separator 为 '/',将路径开头的“/..”替换为“/”。
您也可以filepath.Clean
直接使用并在完成后检查前缀。以下是一些示例输出filepath.Clean
:
ps := []string{
"/a/../b",
"/a/b/./c/../../d",
"/b",
}
for _, p := range ps {
fmt.Println(p, filepath.Clean(p))
}
印刷:
/a/../b /b
/a/b/./c/../../d /a/d
/b /b
也就是说,路径操作不应该是您部署的唯一安全机制。如果您真的担心漏洞利用,请通过沙盒、创建虚拟文件系统/容器等来使用深度防御。
- 1 回答
- 0 关注
- 100 浏览
添加回答
举报