URLs and Hashing

本節包含詳細的規格說明,說明用戶端如何檢查網址。

網址標準化

在檢查任何網址之前,用戶端應對該網址執行一些標準化程序。

首先,我們假設用戶端已剖析網址,並根據 RFC 2396 將其設為有效。如果網址使用國際化網域名稱 (IDN),用戶端應將網址轉換為 ASCII 域名代碼 (Punycode) 表示法。網址必須包含路徑元件,也就是在網域後方至少要有一個斜線 (http://google.com/ 而非 http://google.com)。

首先,請從網址中移除 tab (0x09)、CR (0x0d) 和 LF (0x0a) 字元。請勿移除這些字元的轉義序列 (例如 %0a)。

第二,如果網址結尾是片段,請移除該片段。例如將 http://google.com/#frag 縮短為 http://google.com/

第三,重複執行百分比逸出作業,直到網址不再有百分號逸出為止。(這可能會導致網址失效)。

如何將主機名稱標準化:

從網址中擷取主機名稱,然後執行下列操作:

  1. 移除開頭和結尾的所有點。
  2. 將連續的點替換為單一點。
  3. 如果主機名稱可解析為 IPv4 位址,請將其標準化為 4 個以點號分隔的小數值。用戶端應處理任何合法的 IP 位址編碼,包括八進位、十六進位,以及少於四個元件的編碼。
  4. 如果主機名稱可解析為帶括號的 IPv6 位址,請移除元件中不必要的開頭零,並使用雙冒號語法收合零元件,以便將主機名稱標準化。舉例來說,[2001:0db8:0000::1] 應轉換為 [2001:db8::1]。如果主機名稱是下列兩種特殊 IPv6 位址類型之一,請將其轉換為 IPv4:
    • 已對應至 IPv4 的 IPv6 位址,例如 [::ffff:1.2.3.4],應轉換為 1.2.3.4
    • 使用已知前置字串 64:ff9b::/96 的 NAT64 位址,例如 [64:ff9b::1.2.3.4],應轉換為 1.2.3.4
  5. 將整個字串轉為小寫。

如何將路徑標準化:

  1. /./ 替換為 /,並移除 /../ 和前面的路徑元件,藉此解決路徑中的 /..//./ 序列。
  2. 將連續的斜線替換為單一斜線字元。

請勿將這些路徑標準化方式套用至查詢參數。

在網址中,將所有小於等於 ASCII 32、大於等於 127、#% 的字元以百分比逸出。應使用大寫的 16 進制字元做為逃逸字元。

主機後置字串路徑前置字串運算式

網址完成標準化後,下一步就是建立字尾/字首運算式。每個後置字元/前置字元運算式都包含主機後置字元 (或完整主機) 和路徑前置字元 (或完整路徑)。

用戶端最多可組合 30 個主機後置字元和路徑前置字元。這些組合只會使用網址的主機和路徑元件。系統會捨棄配置方式、使用者名稱、密碼和通訊埠。如果網址包含查詢參數,至少會有一個組合包含完整路徑和查詢參數。

主機:用戶端最多會嘗試五個不同的字串。這 3 個子類型如下:

  • 如果主機名稱不是 IPv4 或 IPv6 文字常值,則最多可使用四個主機名稱,這些名稱的開頭是 eTLD+1 網域,並加上連續的開頭元件。判定 eTLD+1 時,應參考公開字尾清單。舉例來說,a.b.example.com 會產生 example.com 的 eTLD+1 網域,以及主機 (含有額外主機元件 b.example.com)。
  • 網址中的確切主機名稱。根據先前的範例,系統會檢查 a.b.example.com

對於路徑,用戶端最多會嘗試六個不同的字串。這 3 個子類型如下:

  • 網址的確切路徑,包括查詢參數。
  • 不含查詢參數的網址確切路徑。
  • 四個路徑的形成方式是從根目錄 (/) 開始,並依序附加路徑元件,包括結尾斜線。

以下範例說明檢查行為:

對於網址 http://a.b.com/1/2.html?param=1,用戶端會嘗試以下可能的字串:

a.b.com/1/2.html?param=1
a.b.com/1/2.html
a.b.com/
a.b.com/1/
b.com/1/2.html?param=1
b.com/1/2.html
b.com/
b.com/1/

對於網址 http://a.b.c.d.e.f.com/1.html,用戶端會嘗試以下可能的字串:

a.b.c.d.e.f.com/1.html
a.b.c.d.e.f.com/
c.d.e.f.com/1.html
c.d.e.f.com/
d.e.f.com/1.html
d.e.f.com/
e.f.com/1.html
e.f.com/
f.com/1.html
f.com/

(注意:請略過 b.c.d.e.f.com,因為我們只會採用最後五個主機名稱元件和完整主機名稱)。

對於網址 http://1.2.3.4/1/,用戶端會嘗試以下可能的字串:

1.2.3.4/1/
1.2.3.4/

對於網址 http://example.co.uk/1,用戶端會嘗試以下可能的字串:

example.co.uk/1
example.co.uk/

雜湊

Google 安全瀏覽功能只使用 SHA256 做為雜湊函式。這個雜湊函式應套用至上述運算式。

完整的 32 位元雜湊會視情況截斷為 4 位元、8 位元或 16 位元:

  • 使用 hashes.search 方法時,我們目前要求要求中的雜湊值必須精確截斷為 4 個位元組。在這個要求中傳送額外的位元組會危害使用者隱私。

  • 使用 hashList.get 方法hashLists.batchGet 方法 下載本機資料庫的清單時,伺服器傳送的雜湊長度會在清單的命名規則中編碼,其中包含表示雜湊長度的後置字串。詳情請參閱「可用清單」一節。