1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我相信你可以使用filepath.Rel
它(并檢查它是否返回一個(gè)不以 開頭的值..
)。
Rel 返回一個(gè)在詞法上等效于 targpath 的相對(duì)路徑,當(dāng)它通過(guò)中間分隔符連接到 basepath 時(shí)。也就是說(shuō),Join(basepath, Rel(basepath, targpath)) 等價(jià)于 targpath 本身。成功時(shí),返回的路徑將始終相對(duì)于 basepath,即使 basepath 和 targpath 不共享任何元素。如果 targpath 不能相對(duì)于 basepath 或者如果需要知道當(dāng)前工作目錄來(lái)計(jì)算它,則會(huì)返回錯(cuò)誤。Rel 根據(jù)結(jié)果調(diào)用 Clean。
filepath.Rel
還調(diào)用filepath.Clean
其輸入路徑,解析任何.
s 和..
s。
Clean 通過(guò)純?cè)~法處理返回與 path 等效的最短路徑名。它迭代地應(yīng)用以下規(guī)則,直到無(wú)法進(jìn)行進(jìn)一步處理:
將多個(gè)分隔符元素替換為一個(gè)。
消除每一個(gè)。路徑名元素(當(dāng)前目錄)。
消除每個(gè)內(nèi)部 .. 路徑名元素(父目錄)以及它之前的非 .. 元素。
消除以根路徑開頭的 .. 元素:即,假設(shè) 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
也就是說(shuō),路徑操作不應(yīng)該是您部署的唯一安全機(jī)制。如果您真的擔(dān)心漏洞利用,請(qǐng)通過(guò)沙盒、創(chuàng)建虛擬文件系統(tǒng)/容器等來(lái)使用深度防御。
- 1 回答
- 0 關(guān)注
- 117 瀏覽
添加回答
舉報(bào)