1 回答

TA貢獻1831條經驗 獲得超4個贊
我相信你可以使用filepath.Rel
這個(并檢查它是否返回一個不以 開頭的值..
)。
當使用中間分隔符連接到基本路徑時,Rel 返回一個在詞法上等同于 targpath 的相對路徑。也就是說,Join(basepath, Rel(basepath, targpath)) 相當于 targpath 本身。成功時,返回的路徑將始終相對于基本路徑,即使基本路徑和目標路徑不共享任何元素。如果無法使 targpath 相對于基本路徑或者需要知道當前工作目錄來計算它,則會返回錯誤。Rel 對結果調用 Clean。
filepath.Rel
還調用filepath.Clean
其輸入路徑,解析任何.
s 和..
s。
Clean 通過純詞法處理返回與 path 等效的最短路徑名。它迭代地應用以下規則,直到無法進行進一步的處理:
將多個分隔符元素替換為單個分隔符元素。
消除每一個 . 路徑名元素(當前目錄)。
消除每個內部 .. 路徑名元素(父目錄)及其前面的非 .. 元素。
消除開始根路徑的 .. 元素:即,在路徑開頭用“/”替換“/..”,假設分隔符為“/”。
您也可以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 關注
- 153 瀏覽
添加回答
舉報