瀏覽器指紋:網站實際讀取了什麼

逐一檢視網站蒐集的各項數值,從 canvas、WebGL 到音訊、字型、螢幕和時區,以及為什麼連貫的身分勝過隨機化的身分。
瀏覽器指紋辨識,是靠瀏覽器回報的數值,而不是它儲存的任何東西,來識別一個瀏覽器的做法。完全不需要 Cookie。瀏覽器只是回答任何網頁都被允許提出的問題,而這些答案合在一起,就足以獨特到能被再次認出。
會被蒐集的數值
大多數指紋辨識指令碼都是從同樣幾個面向讀取。
顯而易見的
- User-Agent 帶有瀏覽器名稱、版本和平台,並隨每個請求送出。
- 螢幕會回報寬度、高度、色彩深度、像素比和可用的工作區域。
- 語言與時區涵蓋瀏覽器回報的地區設定,以及它計算出的時差。
- 硬體提示提供回報的處理器核心數,在部分瀏覽器上還有大約的記憶體容量。
與繪圖相關的
人們說到指紋辨識時指的就是這些數值,因為它們是間接的。網頁要求瀏覽器畫出某些東西,然後精確讀回實際畫出的結果。
- Canvas 的做法是將文字和圖形繪製到螢幕外的 canvas 並計算雜湊值。結果會隨圖形堆疊、字型和反鋸齒處理而不同。
- WebGL 會公開顯示卡的廠商與轉譯器字串,以及一個已繪製場景的雜湊值。
- 音訊是讓振盪器通過音訊處理圖,並對輸出計算雜湊值。不同堆疊之間的浮點運算行為略有差異。
- 字型偵測會用候選字型量測文字,並根據哪些量測結果不同,推斷安裝了哪些字型。
與網路相關的
- 請求送達時的來源位址,以及地理位置資料庫對它的判斷。
- WebRTC,可能洩漏連線原本不會暴露的位址。
- TLS 與 HTTP 交握欄位的順序與內容,因用戶端而異。
為什麼把每個欄位都隨機化是錯誤的直覺
直覺的防禦方式是每次造訪都改變所有東西。這會適得其反,原因有二。
第一是矛盾。隨機化的欄位彼此並不知道對方的存在。User-Agent 宣稱是 Windows,旁邊的 WebGL 轉譯器字串卻是只有 Apple 硬體才有的,這比任何單一數值本身都是更強的訊號。真實的機器內部是一致的;只有人造的機器才會自相矛盾。
第二是不穩定。每次造訪都回報不同裝置的帳號,描述的是任何真人都不可能擁有的東西。隨時間保持一致,才是一般使用者的樣子。
設定檔的身分涵蓋哪些面向
| 面向 | 處理方式 |
|---|---|
| User-Agent 與平台 | 一起產生,使宣稱的平台與周邊數值相符 |
| 螢幕與像素比 | 依設定檔固定,取自真實顯示器實際回報的尺寸 |
| 時區與地區設定 | 依設定檔設定,並與它使用的網路路徑相符 |
| Canvas、WebGL 與音訊 | 給予穩定的設定檔專屬處理,每次開啟都完全相同 |
| 字型 | 依設定檔配置,與設定檔宣稱的平台一致 |
| WebRTC | 受到限制,不會與設定檔的網路路徑相互矛盾 |
檢查你自己的成果
開啟一個設定檔,造訪指紋測試頁面。有幾個網站會免費公布它們讀到的數值。值得檢查的兩件事,也許和你預期的不同:
- 各項數值彼此一致嗎?平台、字型、顯示卡字串和時區,應該描述的是同一台合理的機器。
- 和上次一樣嗎?關閉設定檔,再開啟一次,重新載入測試。數值會在兩次開啟之間變動的設定檔並不穩定,而穩定性才是重點所在。
測試頁面上的稀有度分數是其中最沒用的數字。它是拿你與該頁面的訪客比較,而這些訪客絕大多數都是正在測試防偵測瀏覽器的人。


