精準解析 · 有意識地正規化
URL 語意可能相近,原始位元組卻已不同。
Inspect 與 normalize 會用 WHATWG URL 處理文字;相對 reference 先套用內部 inspection base,再只輸出 path、query 與 fragment。Resolve 則需要你提供 base URL。整個流程不查 DNS、不發 HTTP,也不判斷遠端網站是否安全。
https://User:pa%24%24@例子.test:8443/a%2Fb/c%20d?tag=red+shoes&tag=web#Top%2FSectionhttps://User:pa%24%[email protected]:8443/a%2Fb/c%20d?tag=red+shoes&tag=web#Top%2FSection主機名稱已序列化成 punycode。preserveRaw 只控制 inspect 報告是否顯示 Raw 行,不會凍結 query 位元組,也不會改變 normalize 的輸出。
URL 結構
每個分隔符號都會改變 parser 狀態。
https:決定特殊 URL 規則與預設 port
User:••••@可能被複製、記錄或意外洩漏
xn--fsqu00a.testUnicode host 會序列化成 ASCII
8443非預設 port 也是 origin 的一部分
/a%2Fb/c%20d%2F 仍位於同一個 path segment
?tag=…&tag=…依原順序列出的 key/value pair
#Top%2FSection不會放進 HTTP request target
把 query 視為有序 multimap
重複參數名稱本身就是有效內容。
若轉成一般 object,tag=red shoes 可能被 tag=web 覆蓋;URLSearchParams entries 會依序保留兩組 pair。
tagred shoesURLSearchParams 會把加號讀成空白tagweb同名參數的第二個值empty∅空字串值flag∅只有 key 的拼法也會讀成空字串值next/billing?step=2值本身是一段巢狀 URL 文字編碼規則對照
同一個字元放在不同 URL component,可能有不同含義。
red shoesred%20shoesencode 使用 %20;form-style query 也可能使用 +
C++C%2B%2BdecodeURIComponent 不會把 + 轉成空白
a/ba%2Fbpath 模式只額外保留 : 與 @,不保留 /
例子.testxn--fsqu00a.test由 WHATWG URL 序列化 hostname
50%50%25再次編碼會得到 %2525
含敏感內容的 URL 檢查
看得懂,不代表適合寫進 log。
Userinfo
高風險分享或記錄前自行移除 username 與 password。
Query 中的 access token
高風險Query 可能進入 history、log 與分析系統。
簽章參數
位元組敏感正規化、decode 或重排都可能讓 signature 失效。
Fragment 內容
Client-side不送進 HTTP request target,仍可能經複製與頁面 script 外洩。
文字編輯前後差異
檢查一次文字編輯實際改了哪些位元組。
這個範例只改了最後一個位元組。調整 query、decode component、正規化 punycode 或 resolve 相對 reference 後,都要重新比較;工具不會替你驗證簽章。
?tag=red+shoes&tag=web&next=%2Fbilling%3Fstep%3D2?tag=red+shoes&tag=web&next=%2Fbilling%3Fstep%3D3