Golang 使用 mux 做 router 遇到 %2F、%0A 的解法

Go 想要做 REST API 或者要對 router、dispatcher 等等的處理,可以使用 mux 的套件。

不過 mux 的套件在 GET 資料,若內容有 "/" 就是 %2F 的話,程式會直接給 404,程式就直接結束,無法處理,要怎麼解決這個問題呢?

  • 註:%0A 是換行字元

Golang 使用 mux 做 router 遇到 %2F 的解法

Go 的 mux 遇到 %2F、%0A 無法處理的問題,後來有推出 UseEncodedPath() 的參數,就不會直接吐 404,讓程式沒辦法做後續的處理。

  • 註:mux.NewRouter().StrictSlash(true) 的 StrictSlash(true) 參數是允許 /index 和 /index/ 通吃的作用,不是處理 %2F 用的。

使用 UseEncodedPath() 後,程式抓到的資料是直接網址的內容(%xxxx),所以需要自己做 urldecode() 的動作。

Go urldecode() 可見:Go import "net/url",可以使用 QueryUnescape() 做 urldecode() 的動作,ex: url.QueryUnescape(params["var1"])

mux 使用 UseEncodePath() 範例

router := mux.NewRouter().StrictSlash(true) // /index、/index/ 通吃
router.UseEncodedPath() // fix %2F、%0A bug, 使用這個就不會 urldecode,需要自己來

mux 抓取變數並 urldecode 範例

params := mux.Vars(req)
params["var1"], err = url.QueryUnescape(params["var1"]) // 需要 import "net/url"

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料