有時候變的不是內容,是位址;有時候位址看起來變了,其實指的是同一個東西。分不清這兩件事,通知就會又多又錯。
| content.html | 內容恆定。讓 URL 上的變化成為唯一的變數。 |
|---|---|
| canonical.html | 同一份內容的第二個 URL,宣告 canonical 指向 content.html。 |
| redirect.html | meta refresh 轉址。落點不是請求位址——應為 unknown,不是 changed,更不是 unchanged。 |
| 特殊 字元 (1)+a.html | 檔名含空白、括號、中文與 +。 |
| session-8f3e9c2a1b7d4f60.html | session id 寫進路徑;跟另一個 sid 的版本內容完全相同。 |
| session-aa11bb22cc33dd44.html | 同上,另一個 sid。 |
| double-encoded.html | 百分比編碼被二次編碼——解碼一次跟兩次答案不同。 |
| redirect-chain.html | 雙跳轉址鏈,起點。落點跟起點已經是不同資源。 |
| redirect-chain-2.html | 轉址鏈中間那一跳。 |
| idn-homograph.html | IDN/punycode 同形異義與仿冒同形字。 |
| credentials-in-url.html | URL 內嵌帳密(demo:not-a-real-password@,純文字展示)——必須拒絕。 |
content.html?utm_source=a → ?utm_source=b | 不得回報變動。規格明寫「只改 tracking parameter 不算」。 |
|---|---|
content.html#a 與 content.html#b | 片段不會送到伺服器。兩者是同一個目標——normalizeSafeHttpUrl 會清掉片段。 |
content.html?a=1&a=2 | 重複參數的意義由伺服器決定。監控不得自行去重或排序後當成同一個 URL。 |
https://user:pass@host/… | 必須拒絕。URL 裡的憑證是憑證,不是位址的一部分。 |
| 長度超過 2048 的 URL | normalizeSafeHttpUrl 以 2048 為上限,超過應具名拒絕,而不是截斷後照抓。 |
http:// 而非 https:// | 應拒絕。降級到明文是一種靜默的安全損失。 |
IDN:https://例え.example.com | 與其 punycode 形式 xn--r8jz45g.example.com 是同一個主機。兩者建成兩個監控會產生重複通知。 |
結尾斜線:/path 與 /path/ | 不保證是同一頁。不得自行補上或去掉。 |
%2F 與 / | 編碼後的斜線不是路徑分隔符。把它解碼會走到別的資源。 |
localhost、127.0.0.1、169.254.169.254 | 應拒絕。指向內網的目標是 SSRF,不是監控。 |
上表多數項目測的是建立監控時的驗證,不需要頁面存在——填進去看它怎麼回答就好。