亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查文件是否駐留在基本目錄中的最安全方法是什么?

檢查文件是否駐留在基本目錄中的最安全方法是什么?

Go
楊__羊羊 2023-08-21 14:56:01
Go 在任何平臺上驗證給定文件路徑是否位于基本路徑內的最安全方法是什么?這些路徑最初以字符串形式提供,并使用“/”作為分隔符,但它們是用戶提供的,我需要假設大量惡意輸入。我應該執行哪種類型的路徑規范化來確保評估諸如“..”之類的序列,以便我可以安全地檢查基本路徑?各種文件系統和平臺上有哪些需要注意的例外情況?哪些 Go 庫在這方面應該是安全的?結果將被提供給外部函數,例如os.Create和sqlite3.Open,并且任何未能識別出基本路徑已離開的行為都將構成安全違規。
查看完整描述

1 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

我相信你可以使用filepath.Rel這個(并檢查它是否返回一個不以 開頭的值..)。

當使用中間分隔符連接到基本路徑時,Rel 返回一個在詞法上等同于 targpath 的相對路徑。也就是說,Join(basepath, Rel(basepath, targpath)) 相當于 targpath 本身。成功時,返回的路徑將始終相對于基本路徑,即使基本路徑和目標路徑不共享任何元素。如果無法使 targpath 相對于基本路徑或者需要知道當前工作目錄來計算它,則會返回錯誤。Rel 對結果調用 Clean。

filepath.Rel還調用filepath.Clean其輸入路徑,解析任何.s 和..s。

Clean 通過純詞法處理返回與 path 等效的最短路徑名。它迭代地應用以下規則,直到無法進行進一步的處理:

  1. 將多個分隔符元素替換為單個分隔符元素。

  2. 消除每一個 . 路徑名元素(當前目錄)。

  3. 消除每個內部 .. 路徑名元素(父目錄)及其前面的非 .. 元素。

  4. 消除開始根路徑的 .. 元素:即,在路徑開頭用“/”替換“/..”,假設分隔符為“/”。

您也可以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

也就是說,路徑操作不應該是您部署的唯一安全機制。如果您確實擔心被利用,請通過沙箱、創建虛擬文件系統/容器等進行深度防御。


查看完整回答
反對 回復 2023-08-21
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號