URL 邊界
URL 編碼:編碼資料,不是整個網址
URL 有結構:scheme、host、path、query、fragment 的跳脫規則不同。對整個字串編碼通常會破壞這個結構。
內容更新: · 維護者與修正回報
追蹤查詢值如何進入 URL
假設搜尋文字是 tea & cake + milk。以 url.searchParams.set("q", "tea & cake + milk") 設定值後,序列化會得到 q=tea+%26+cake+%2B+milk。讀取 searchParams.get("q") 會還原原文:編碼後的 & 保留在值內,原本的加號則編成 %2B。
把完整結果貼入 URL 檢查工具,對照 query 與原始輸入。URLSearchParams 使用表單式查詢編碼,+ 代表空白;decodeURIComponent 本身不會把 + 轉成空白,因此不能直接拿它取代 query parser。
| 情況 | 判讀與下一步 |
|---|---|
| q=a&b | 未跳脫的 & 會開始另一個參數;使用 searchParams.set 保留資料意義。 |
| q=%2520 | 解析一次得到的是文字 %20;請檢查呼叫端是否重複編碼。 |
| #section | Fragment 不會隨 HTTP 請求目標送出;伺服器需要的參數不要放在這裡。 |
從元件組成 URL
從完整的 HTTP(S) URL 開始,一次只修改一個 path segment 或 query value。如此能保留 ?, &, = 與 / 的結構意義,而不是把它們變成資料。
辨識重複編碼
%20 已代表空白。再次編碼會得到 %2520,這會改變值,而不是更安全。只解碼要檢視的元件,並在邊界只編碼一次。
解析不是安全審查
語法正確的 URL 仍可能指向不可信主機或不安全的 redirect target。抓取、轉址或呈現外部位址前,仍需 allowlist 與伺服器端驗證。
https://example.test/search?q=tea%20set&lang=zh-TW資料可信度