Top 10 測試目標

URL 與特殊字元

有時候變的不是內容,是位址;有時候位址看起來變了,其實指的是同一個東西。分不清這兩件事,通知就會又多又錯。

11 個頁面+一張 URL 形式對照表

十一個頁面

content.html內容恆定。讓 URL 上的變化成為唯一的變數。
canonical.html同一份內容的第二個 URL,宣告 canonical 指向 content.html。
redirect.htmlmeta refresh 轉址。落點不是請求位址——應為 unknown,不是 changed,更不是 unchanged。
特殊 字元 (1)+a.html檔名含空白、括號、中文與 +
session-8f3e9c2a1b7d4f60.htmlsession id 寫進路徑;跟另一個 sid 的版本內容完全相同。
session-aa11bb22cc33dd44.html同上,另一個 sid。
double-encoded.html百分比編碼被二次編碼——解碼一次跟兩次答案不同。
redirect-chain.html雙跳轉址鏈,起點。落點跟起點已經是不同資源。
redirect-chain-2.html轉址鏈中間那一跳。
idn-homograph.htmlIDN/punycode 同形異義與仿冒同形字。
credentials-in-url.htmlURL 內嵌帳密(demo:not-a-real-password@,純文字展示)——必須拒絕。

拿這些 URL 形式去建監控,看平台怎麼回答

content.html?utm_source=a?utm_source=b不得回報變動。規格明寫「只改 tracking parameter 不算」。
content.html#acontent.html#b片段不會送到伺服器。兩者是同一個目標——normalizeSafeHttpUrl 會清掉片段。
content.html?a=1&a=2重複參數的意義由伺服器決定。監控不得自行去重或排序後當成同一個 URL。
https://user:pass@host/…必須拒絕。URL 裡的憑證是憑證,不是位址的一部分。
長度超過 2048 的 URLnormalizeSafeHttpUrl 以 2048 為上限,超過應具名拒絕,而不是截斷後照抓。
http:// 而非 https://應拒絕。降級到明文是一種靜默的安全損失。
IDN:https://例え.example.com與其 punycode 形式 xn--r8jz45g.example.com 是同一個主機。兩者建成兩個監控會產生重複通知。
結尾斜線:/path/path/不保證是同一頁。不得自行補上或去掉。
%2F/編碼後的斜線不是路徑分隔符。把它解碼會走到別的資源。
localhost127.0.0.1169.254.169.254應拒絕。指向內網的目標是 SSRF,不是監控。

上表多數項目測的是建立監控時的驗證,不需要頁面存在——填進去看它怎麼回答就好。

共同的問題:URL 是身分還是位址? 把它完全當身分,追蹤參數一換就誤報;完全不當身分,兩個 URL 的同一件事會通知兩次。