數位指紋採集技術是指在使用者返回您的網站時,嘗試辨識使用者,或是在不同網站上辨識同一使用者。你的設定與其他人的設定可能會有很多不同之處。舉例來說,您使用的裝置可能不是 其他瀏覽器、螢幕尺寸也不同,且安裝了不同的字型。如果我有「Dejavu Sans」字型 安裝您的軟體後,任何網站只要查看該字型,即可判斷該網站是否有差異。這就是指紋辨識的運作方式:您建立這些資料點的集合,每個資料點都提供更多方法來區分使用者。
更正式的定義可能像這樣:數位指紋採集是使用明顯且不明顯的長效型 使用者設定的特性,以便盡可能區分其他使用者。
指紋技術會侵害使用者隱私權
不過,在某些情況下 (例如詐欺偵測) 來保護使用者數位指紋採集相當重要。數位指紋採集 用來跨網站追蹤使用者,通常會在使用者未同意的情況下進行追蹤 (有時則是 未充分告知使用者。完成後,這些使用者通常會覺得這有點令人不安,並感到相當不悅。
數位指紋採集的功用是找出使用者之間的區別。指紋辨識可用於辨識同一位使用者在同一網站上的活動,或同時辨識兩個不同瀏覽器設定檔中的同一位使用者。也就是說,指紋技術可用於跨網站追蹤使用者。具有確定性和過度浮現的追蹤方式 例如儲存具有專屬使用者專屬 ID 的 Cookie,在某種程度上由使用者觀測到 (前一單元說明瞭部分方法)。但數位指紋採集較難 因為這屬於隱密功能仰賴不具變化的特徵,且很有可能在無形中發生。這就是為什麼稱為「指紋辨識」。無論是數位指紋或手指末端的指紋,都很難改變。
瀏覽器供應商知道使用者不喜歡受到追蹤,且持續導入可限制數位指紋採集的功能 (我們在上一個單元中已介紹過某些部分)。我們將在這裡探討這些功能可能對您的業務需求造成的影響,以及如何在保護隱私權的情況下,繼續執行您想要執行的操作。這項功能主要是讓您瞭解瀏覽器防護指紋記錄功能如何影響您的操作方式,而非讓您瞭解如何停止使用指紋記錄功能。
實際上,大多數開發人員和企業都不需要建立使用者指紋。如果應用程式要求使用者登入 您的使用者會在徵得同意的情況下表明您的身分,且他們可以透過某種方式 選擇自己的應用程式這項功能可確保使用者隱私,因此能保障隱私。您的應用程式可能完全不需要使用者登入,這樣一來就能更有效地保護使用者的隱私權 (您只會收集所需的資料)。
正確做法
評估第三方的指紋辨識功能。在「第三方」模組中,您可能已經列出所納入的所有第三方服務,以及這些服務所發出的網路要求。您可以檢查這些要求,瞭解傳回給原始發送者的資料 (如有)。不過,這通常很困難;因為指紋辨識本質上是一種隱密的程序,涉及要求不需使用者核准的資料。
您也應詳閱第三方服務和依附元件的隱私權政策,找出是否有使用指紋記錄的跡象。有時也稱為「機率比對」或「機率比對技術」的一部分,與「決定性比對」相對。
指紋辨識的運作方式
通常,您個人組合中的所有屬性都是您獨有的,或至少是少數類似使用者才有的,因此可用於秘密追蹤您。
附註:被動和主動指紋
這裡有個實用的區別,可用來區分被動和主動指紋辨識技術。被動數位指紋採集 是預設技術運用網站資訊的方法;編碼器-解碼器架構 這會明確地干擾瀏覽器以取得額外資訊。這種區別很重要 可能試圖偵測、攔截或緩解主動技術。可以限制 API 或閘道為對話方塊背後 要求使用者授權 (並通知使用者正在使用或拒絕他們使用) )。被動技術是指使用已提供給網站的資料,這通常是因為在資訊高速公路的初期,這類資訊通常會提供給所有網站。使用者代理程式字串就是這類資訊的例子,我們會在後續進一步探討這項資訊。很多都有助於提供大量 使用者的瀏覽器、版本和作業系統等相關資訊,網站可能會以不同的方式呈現 根據這些資訊然而,這也會增加可辨識資訊的識別性、 有助於識別不同的使用者因此這類資訊已不復存在 ,使其變得無法區分如果您執行的動作需要此資訊 (例如根據使用者代理程式採用不同的程式碼分支),則隨著瀏覽器越來越常凍結或停止提供此資訊,這個程式碼就可能會中斷。測試是這裡的最佳防禦工事 ( 稍後查看)。
附註:評估指紋可用性
用來評估每個資料點提供多少資訊的技術指標稱為「熵」,以位元為單位。某些功能可能有許多不同的可能值 (例如已安裝的字型清單),因此會為總數貢獻大量位元,而某些功能 (例如您使用的作業系統) 可能只會增加少量位元。HTTP Almanac 說明現有的數位指紋採集方式 程式庫會將來自不同 API 的回應合併成「雜湊」,這種程序自動化,因此只能找出 一小群使用者 (甚至只有一位使用者)Maud Nalpas 進一步探討 觀看這部 YouTube 影片,簡單來說,假設 好友名單,包含他們喜愛的音樂、喜愛的食物和使用的語言...除了名稱外,還有他們的名字 已移除聯絡人清單很有可能足以做為您的好友識別,或者您也可以縮小搜尋範圍 並分享給部分使用者數位指紋採集的運作方式而你喜歡的項目清單就會變成「雜湊」。取代為 這種雜湊值會更容易在兩個未連結的網站上識別出同一位使用者,這項功能的目標是 追蹤:規避使用者的隱私保護。
瀏覽器會如何處理數位指紋採集?
重要的是,瀏覽器供應商非常清楚,網站 (或網站上的第三方) 有許多不同的方法,可以為使用者計算出獨特的指紋,或是使用不同的資訊位元,讓指紋具有獨特性。其中有些方式是明確且刻意提供的,例如瀏覽器的使用者代理程式字串,這類資訊通常會識別使用中的瀏覽器、作業系統和版本 (如果您和我使用不同的瀏覽器,這類資訊有助於區分兩者)。其中有些方法並非刻意設計為可數位指紋採集 ,例如字型清單,或瀏覽器可用的視訊和音訊裝置。(瀏覽器不必使用 以取得這些裝置的名稱清單)。有些人確立可以妥善保護指紋 例如在畫布元素上精確顯示字型消除鋸齒。 還有更多類似的情況,每當您的瀏覽器與我的瀏覽器有所不同,就會增加熵,因此可能會提供一種方法,用來區分您和我,並在各個網站上盡可能以獨特的方式識別個人。https://amiunique.org 列出了許多可能會產生指紋的功能 (但絕非全面),而且這份清單會持續增加 (因為能夠產生使用者指紋,即使使用者不希望或不預期這麼做,也能帶來龐大的金錢利益)。
不支援某些強大的 API
對上述所有計算使用者指紋的方法,瀏覽器廠商都做出了回應, 來自這些 API 的熵量最嚴格的做法是從一開始就不要實作這些功能。部分主要瀏覽器早已導入各種硬體和裝置 API (例如 NFC 和透過 這個 這顯然可能會影響您的應用程式和服務:在未實作 API 的瀏覽器中,您完全不會使用 API,而且可能會 限製或完全排除某些硬體方法,不做任何考慮。
使用者權限閘道
瀏覽器廠商採取的第二種做法,就是防止在未獲使用者明確授權的情況下,存取 API 或資料。 這種方法往往是基於安全考量,所以網站不能使用網路攝影機拍照 不用經過您的許可!不過,隱私權與安全性可能會有類似的興趣。當然,識別使用者的位置本身就是一種隱私權侵犯,但這也是指紋特徵的獨特性來源之一。需要權限 以瞭解地理位置並不會讓某個位置增加該指紋所需的額外熵,但會 基本上,這種做法不需要「使用」地理位置進行數位指紋採集,因為這種收集方式不會再發生。解碼器的重點在於 數位指紋採集的目的在於「明顯」區分使用者。如果準備讓使用者知道 ,因此不需要數位指紋採集技術。請使用者建立帳戶並登入 。
加入不確定性
在某些情況下,瀏覽器供應商會採用第三種方法,將 API 回應「模糊化」,使回應內容不那麼精細,進而降低識別能力。這項功能是資料模組中隨機回覆機制的一部分,可讓您在向使用者收集資料時避免不小心收集到可識別資料。瀏覽器供應商
也能使用這個方法處理提供給網頁應用程式和第三方的 API 資料。舉例來說,用於評估網頁成效的時間點 API 非常精確,可從 window.performance.now()
取得。瀏覽器會以微秒為精確度來判斷這些值,但為了避免在指紋辨識中使用這些值 (以及為了避免時間攻擊的安全性),我們刻意將傳回的值四捨五入至最接近的 20 微秒邊界。這麼做的目的是確保 API 仍可發揮作用,但讓回應不那麼容易辨識:也就是說,讓您的裝置看起來更像其他人的裝置,而非只屬於您個人。Safari 提供簡化版的系統設定
。
強制執行隱私公開程度上限
「隱私公開程度上限」是一項提案,建議瀏覽器估算每個數位指紋途徑會揭露的資訊。瀏覽器尚未提供這項功能。我們的目標是允許使用強大的 API,同時維護使用者隱私。進一步瞭解隱私預算提案。
使用廣泛的測試環境
所有這些都會影響您建構應用程式和服務的方式。特別值得一提的是,在這個領域,瀏覽器和平台的回應和方法各有不同。也就是說,在不同環境中測試工作是「關鍵」。 這項原則當然一向很重要,但我們可以合理假設,無論特定轉譯引擎位於哪個瀏覽器或平台,HTML 轉譯或 CSS 都會保持不變 (因此,您可能會想只在單一以 BLINK 為基礎的瀏覽器中進行測試)。但在 API 使用情形中,情況並非如此,因為共用轉譯引擎的瀏覽器,在如何強化 API 介面以防指紋辨識方面,可能會有很大的差異。
正確做法
- 測試自己的數據分析和目標對象,決定測試時應優先使用的瀏覽器。
- 適合用於測試的瀏覽器包括 Firefox、Chrome、Edge、桌上型電腦上的 Safari、Android 上的 Chrome 和 Samsung Internet,以及 iOS 上的 Safari。這可確保您在測試三種主要的轉譯引擎 (Firefox 中的 Gecko 與 Blink 的各種分支) 之間進行測試 Chrome、Edge 和 Samsung Internet,以及 Safari 中的 Webkit),以及行動裝置和電腦平台。
- 如果您的網站也可能在較不常見的裝置上使用,例如平板電腦、智慧手錶或遊戲主機,請一併進行測試。某些硬體平台在行動裝置和電腦上更新的時間可能落後,因此部分 API 可能未實作或 這些平台的瀏覽器
- 請使用一或多個聲稱以使用者隱私為優先的瀏覽器進行測試。盡可能納入常用瀏覽器的即將推出的預發布版和測試版,前提是您可以使用這些版本:Safari 的技術預覽版、Chrome 的 Canary 版、Firefox 的 Beta 版。這樣一來,您就能在 API 發生故障或有變更影響網站前,盡可能找出這些問題,同樣地,請在參考任何您提供的數據分析時,考量使用者的環境。如果您的 使用者數量較多的舊款 Android 手機,請務必將這些手機納入測試。大多數人沒有 快速硬體和最新版本
- 使用乾淨的設定檔和無痕模式/私密瀏覽模式進行測試。這可能是因為您已授予 授予個人資料夾需要的權限測試如果你拒絕讓該網站存取任何問題,會發生什麼事。
- 在 Firefox 的指紋保護模式中明確測試網頁。如此一來,網頁就會顯示權限對話方塊,或是針對部分 API 傳回模糊資料。 如此一來,就能確認服務中的第三方是否使用指紋資料 。然後,您可以思考刻意模糊化的程度是否會讓操作過程更困難。建議您根據情況進行修正,從其他來源取得資料,或不使用這項資料,或是使用較不精細的資料。
- 如先前在第三方單元中所述,您也應稽核第三方依附元件,看看是否有使用指紋記錄技術。被動指紋偵測難以偵測 (以及
這就不可能),但數位指紋採集模式可能會標記某些數位指紋採集技術
並尋找使用 navigator.userAgent 或未預期的
<canvas>
物件建立,或許也說明瞭幾種方法 值得進一步審查另外,您也可以查看「機率比對」一詞的使用方式行銷或 技術內容:說明第三方;有時可能代表使用數位指紋採集技術。
跨瀏覽器測試工具
基於隱私權考量,程式碼的測試作業很難自動化,我們先前已說明手動測試時應注意的事項。舉例來說,如果您拒絕網站存取任何 API 的權限,會發生什麼事?系統會如何向使用者顯示?自動測試無法判斷該網站是否以協助使用者信任網站,也無法透過相反方式鼓勵使用者信任網站。 或是認為有東西遭到隱藏
不過,網站完成稽核後,您可以自動化測試 API,確認新版瀏覽器 (或即將推出的「Beta」和「預覽」版) 中沒有任何問題,這類測試應納入現有測試套件。發生某些問題 使用自動化測試工具時,您可以考慮使用自動化測試工具。這是因為大多數瀏覽器都允許 控管可用的 API 和功能Chrome 可透過指令列切換功能使用, 和 Firefox 一樣,而且可在測試工具中使用這些功能 設定可讓您在開啟或關閉 API 的情況下執行特定測試。(例如,請參閱 Cypress 的瀏覽器啟動外掛程式和 puppeteer 的 launch.args 參數,瞭解如何在啟動時新增瀏覽器標記)。
只使用使用者代理程式字串取得概略資訊
舉另一個例子來說,自從網際網路誕生以來,瀏覽器就會在每個 HTTP User-Agent 標頭的要求中,傳送自身的說明。一直以來,許多人都會勸告網頁程式開發人員不要使用使用者代理程式標頭的內容,為不同瀏覽器提供不同的內容,但網頁程式開發人員一直都這麼做,而且在某些 (但非所有) 情況下,他們有一定程度的理由。由於瀏覽器不希望網站因為使用者體驗不佳而將其排除,因此每個瀏覽器都會假裝成其他瀏覽器,而使用者代理程式字串會類似以下內容:
Mozilla/5.0 (Linux; Android 6.0.1; SGP771 Build/32.2.A.0.253; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36
。
這項主張包括 Mozilla/5.0 (此瀏覽器與首屆太空人同時上市) 的瀏覽器 二十多年前,在國際太空站上登載了。當然,使用者代理程式字串是用於指紋辨識的豐富熵源,為了降低指紋辨識的可能性,瀏覽器製造商已凍結使用者代理程式標頭,或正在努力凍結標頭。這是另一個變更 API 提供的資料,但不必完全移除 API 的例子。如果傳送空白的使用者代理程式標頭,將導致無數網站誤以為有網站存在。一般來說,瀏覽器 就是移除它中的部分細節 然後保持不變(您可以在 Safari、Chrome 和 Firefox 中看到這種情況。)這項保護機制 詳細的數位指紋採集表示您再也無法依賴使用者代理程式標頭 因此,請務必找出替代資料來源。
請注意,使用者代理程式中的資料並不會完全消失,但可能會以較低的細緻度提供,或有時會因為回報的數字未變動而導致不準確。舉例來說,Firefox、Safari 和 Chrome 都會將回報的 macOS 版本號碼上限設為 10 (請參閱「使用者代理程式字串縮減更新」一文,進一步瞭解這項做法)。如要瞭解 Chrome 如何縮減使用者代理程式字串中的資料,請參閱「使用者代理程式縮減」一文。簡而言之,您可以預期回報的瀏覽器版本號碼只會包含主要版本 (因此即使瀏覽器版本為 123.10.45.108,版本號碼也會顯示為 123.0.0.0),而作業系統版本則不會顯示詳細資料,且會凍結為少數幾個不變的選項之一。因此,假設在虛構的「Windows 20」上執行的虛構 Chrome 版本為 123.45.67.89,則會回報的版本號碼如下:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/123.0.0.0 Safari/537.36
您需要的核心資訊 (瀏覽器版本) 仍可供使用:Windows 上的 Chrome 版本為 123。但子公司 資訊 (晶片架構、Windows 版本、模擬的 Safari 版本、瀏覽器子版本) 。
請比較這項資訊與不同平台上的「目前」Chrome 使用者代理程式:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
、
唯一的差別在於 Chrome 版本號碼 (104) 和平台 ID。
同樣地,Safari 的使用者代理程式字串會顯示平台和 Safari 版本號碼,也會提供 iOS 上的 OS 版本,但其他所有內容都會凍結。因此,假設在虛構的 macOS 20 上執行的虛構 Safari 版本 1234.5.67,其使用者代理程式可能會是:
Mozilla/5.0 (Macintosh; **Intel Mac OS X 10_20_0**) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15
、
在假想的 iOS 20 上,可能會是:
Mozilla/5.0 (iPhone; CPU **iPhone OS 20_0** like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/**20.0 Mobile/15E148 Safari/605.1.15**
。
再次強調,核心資訊 (即 Safari,在 iOS 或 macOS 上) 仍可供使用,iOS Safari 也仍會提供 iOS 版本號碼;但過去提供的許多輔助資訊已遭到凍結。重要的是,這包括 Safari 版本號碼 (不一定隨時可用)。
遭檢舉使用者代理程式的變更過於熱辯。https://github.com/WICG/ua-client-hints#use-cases totalmarises 摘要 導致改變的部分論點和原因;Rowan Merewood 則設有投影片 ,以及避免使用使用者代理程式來區分差異的策略,詳情請參閱「通用 Analytics 客戶提示」提案。
模糊測試
模糊是資安實踐的術語,其中呼叫 API 時會得到非預期的值,希望能夠處理
以免發生非預期的情況並造成安全性問題。網站開發人員應熟悉跨網站指令碼攻擊 (XSS)。
這類程序涉及在網頁中加入惡意指令碼,這通常是因為網頁並未正確逸出插入的 HTML (所以您進行搜尋)
其中含有 <script>
文字)。後端開發人員會瞭解SQL 注入,其中資料庫查詢未正確驗證使用者輸入內容,可能會導致安全性問題 (xkcd 的 Little Bobby Tables 就是一個很好的例子)。模糊 (又稱為模糊測試) 則更為正確
用於自動嘗試向 API 提供許多無效或非預期的輸入內容,並檢查結果是否有安全性外洩;
發生當機或其他不當處理以上都是故意提供不正確資訊的例子。但在這裡
濫用使用者代理程式,藉此鼓勵開發人員停止依賴這些資料。
正確做法
- 檢查程式碼集,確認是否有仰賴使用者代理程式字串的情況 (搜尋「
navigator.userAgent
」可能會找到次數最多的結果) ,而您的後端程式碼可能會尋找User-Agent
做為標頭,包括 依附元件 - 如果您發現程式碼中使用了其他用途,請找出程式碼要檢查的內容,並找出其他方法來進行區分 (或找出替代依附元件,或透過提交問題或檢查更新來與依附元件上游合作)。有時需要透過瀏覽器區隔功能來解決錯誤,但一旦使用者代理程式凍結,就越來越無法以這種方式解決。
- 你可能不會受到影響。如果您只採用品牌、主要版本和平台的核心價值,這些價值幾乎不會改變 正確的網址,且該值正確無誤
- MDN 說明了避免依賴使用者代理程式字串 (「瀏覽器探查」)的好方法,其中主要方法是功能偵測。
- 如果您某種程度上仰賴使用者代理程式字串 (即便是運用到一些仍然有用的核心值),也是個好方法 ,試用即將在新瀏覽器版本中即將推出的使用者代理程式進行測試。您可以透過 Beta 版或技術預覽版本,使用這些即將推出的瀏覽器版本進行測試,但也可以設定自訂使用者代理程式字串進行測試。在進行本機開發時,您可以在 Chrome、Edge、Firefox 和 Safari 中覆寫使用者代理程式字串,以便檢查程式碼如何處理可能從使用者收到的不同使用者代理程式值。
用戶端提示
提供這項資訊的主要提案之一是「User-Agent Client Hints」
但並非所有瀏覽器都支援這個做法支援的瀏覽器會傳送三個標頭:Sec-CH-UA
提供瀏覽器品牌和版本號碼;Sec-CH-UA-Mobile
指出要求是否來自行動裝置;Sec-CH-UA-Platform
則是作業系統名稱。(解析這些標頭的難度比想像中高,因為它們是結構化標頭,而非簡單的字串,且瀏覽器會傳送「棘手」的值,如果未正確解析,就會錯誤處理。也就是
瀏覽器一開始即進行了「模糊測試」的例子,開發人員必須使用這項資料來處理
因為資料設計使得錯誤或延遲剖析可能會產生不良結果 (例如顯示沒有成效提升的品牌)
或未正確關閉的字串)。幸好,瀏覽器也會直接將這項資料以 navigator.userAgentData
的形式提供給 JavaScript,在支援的瀏覽器中,這可能會是類似以下物件的樣子:
{
"brands": [
{
"brand": " Not A;Brand",
"version": "99"
},
{
"brand": "Chromium",
"version": "96"
},
{
"brand": "Google Chrome",
"version": "96"
}
],
"mobile": false
}