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。

追蹤查詢值如何進入 URL
情況判讀與下一步
q=a&b未跳脫的 & 會開始另一個參數;使用 searchParams.set 保留資料意義。
q=%2520解析一次得到的是文字 %20;請檢查呼叫端是否重複編碼。
#sectionFragment 不會隨 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

資料可信度

資料來源