網址列的 next 參數被編碼了兩次。解碼一次跟解碼兩次,答案完全不同。
點下面這個連結,網址會帶 ?next=%252Fadmin%252Fdashboard——那是 %2Fadmin%2Fdashboard 又被編碼了一次。
| 解碼一次 | %252Fadmin%252Fdashboard → %2Fadmin%2Fdashboard——看起來還是編碼過的,不是一個乾淨的路徑。 |
|---|---|
| 解碼兩次 | 再解一次 → /admin/dashboard——如果有檢查「這個值不可以是 /admin 開頭」,這個檢查如果只做了一次 decodeURIComponent,這個值會通過檢查,因為它看起來還不是 /admin 開頭。 |
| 為什麼危險 | 過濾器在編碼層做檢查、瀏覽器或後端在使用前又多解碼一次——兩邊對「這個字串現在是什麼」的認知不一致,就是雙重編碼繞過的原理。 |
% 的值。