瀏覽器隱身模式下的你,仍然沒有任何隱私
你以為你瀏覽器開了隱身模式,你就真的"隱身"了嗎?No!No!No!今天帶你從前端的視角來看了解瀏覽器的隱身模式
你以為你瀏覽器開了隱身模式,你就真的"隱身"了嗎?No!No!No!今天帶你從前端的視角來看了解瀏覽器的隱身模式
作者:獨釣寒江雪
鏈接:https://juejin.cn/post/6994228279909548062
他的文章寫得都非常棒????~ 感興趣的同學(xué)可以點擊文末的「閱讀原文」關(guān)注哦~
本文從科普和技術(shù)視角對瀏覽器隱身模式進行介紹,全文脈絡(luò)如下,讀者可根據(jù)興趣選擇對應(yīng)章節(jié)閱讀。

認識隱私模式
隱私模式隱藏了什么
現(xiàn)代網(wǎng)絡(luò)瀏覽器,大多數(shù)都增加了隱私瀏覽模式來瀏覽網(wǎng)頁,旨在保護用戶隱私。Chrome 稱之為隱身模式;Opera、Safari 和 Firefox 中一般稱為隱私瀏覽。這些模式以深色主題和蒙面人物圖標(biāo)為特征,可以給用戶一種匿名瀏覽的印象。芝加哥大學(xué)和漢諾威萊布尼茨大學(xué)的研究人員發(fā)現(xiàn),人們對隱私瀏覽或隱身模式存在很多誤解,許多用戶認為隱私瀏覽可以保護他們免受惡意軟件、廣告、跟蹤腳本和互聯(lián)網(wǎng)服務(wù)提供商 (ISP) 的監(jiān)控。
其實,隱私瀏覽旨在避免在計算機上保留瀏覽會話的痕跡。因此,當(dāng)你打開隱私窗口時,主瀏覽窗口中的 cookie、瀏覽歷史不會被保留。當(dāng)你關(guān)閉隱私瀏覽窗口時,你的瀏覽歷史記錄、保存的密碼以及你在該窗口的文本字段中鍵入的內(nèi)容(用戶名、電話號碼等)都將被擦除。這意味著使用你的計算機并啟動瀏覽器的下一個人將無法找出你在私人瀏覽會話期間訪問了哪些網(wǎng)站,即便是你自己,當(dāng)下次使用這些網(wǎng)站未登錄帳戶時,你也將以新用戶的身份出現(xiàn)。
隱私瀏覽是一種非常有用且方便的工具,可用于快速瀏覽會話,不會在你的計算機上留下痕跡。它將保護你的隱私免受使用你計算機的其他人的侵害,并減少你在訪問網(wǎng)站時透露的一些有關(guān)你自己的信息。但是隱私瀏覽不會讓你匿名,也不會保護你免受監(jiān)視和大型技術(shù)窺探。
說到泄露隱私,很多人認為只要自己不登錄、不使用 cookie,使用瀏覽器的無痕模式,自己的數(shù)據(jù)信息就是安全的、自己瀏覽了什么就只有自己知道了,那么,我們不妨直接看看瀏覽器官方自己的定義吧。
無痕模式(Incognito mode)是 Chrome 瀏覽器的一種設(shè)置,在 Chrome 瀏覽器里,它是這樣描述的:
簡單來說,Chrome 無痕模式只是幫你刪除了你存在本地的搜索和瀏覽記錄,只是看起來“無痕”而已。要在 Chrome 中以隱身模式打開頁面,請單擊右上角的三點圖標(biāo),從出現(xiàn)的下拉菜單中選擇打開新的無痕窗口,或按 Ctrl+Shift+N。一個帶有深色主題的新窗口彈出,并顯示一條通知:“您已進入無痕模式”, 細則解釋了隱身模式的優(yōu)缺點。默認情況下,第三方 cookie(用于跨不同站點跟蹤你)被禁用。
至于如何開啟隱身模式,相信大多數(shù)人都是知道的,如果不知道,或者不知道某一款特定的瀏覽器如何開啟隱身模式,可以參考下面這個鏈接。
How do I set my browser to Incognito or private mode?[1]
在實踐中,即使在隱私模式下,網(wǎng)站仍然可以通過關(guān)聯(lián)其他信息來發(fā)現(xiàn)你的身份,例如你的 IP 地址、設(shè)備類型和瀏覽習(xí)慣(一天中的時間、訪問的頁面等),隱私瀏覽不會隱藏任何數(shù)據(jù)。Facebook 和 Google 等大型科技公司擁有大量關(guān)于用戶的信息,通過連接這些點,即使你尚未登錄帳戶,它們也可以識別你的身份。
瀏覽器隱身模式真的可以隱身嗎?
通過前面的介紹,想必你的答案是確定的:不能。
我們可以通過一個展示隱私瀏覽跟蹤的示例網(wǎng)站 ——?Nothing Private[2]來證明這一點。這個網(wǎng)站的測試方式是讓你先提交一個你的標(biāo)識信息,之后讓你使用瀏覽器的無痕模式訪問網(wǎng)站,猜猜網(wǎng)站會不會認出你。
這里,我先填入了“獨釣寒江雪”,很明顯的,當(dāng)我提交信息時,瀏覽器除了發(fā)送了我填寫的“獨釣寒江雪”,還有一個finger
字段。

當(dāng)我使用無痕模式再次打開這個網(wǎng)站時,瀏覽器又攜帶了相同的finger
字段去服務(wù)器查詢相關(guān)信息,于是,我被識別出來了。

綜上:瀏覽器無痕模式并不能保護你的數(shù)據(jù)信息不被網(wǎng)站的服務(wù)器所獲取。準(zhǔn)確的說,無痕模式就是掩耳盜鈴而已。有興趣的話,您不妨親自去Nothing Private[3]體驗一下,關(guān)于它的原理,后續(xù)章節(jié)會繼續(xù)介紹。
隱私模式不能干什么
它不會保護你免受病毒或惡意軟件的侵害;
它不會讓你的 Internet 服務(wù)提供商 (ISP) 無法看到你上網(wǎng)的位置(事實上,無論你做什么,你的 ISP 幾乎都可以訪問你的所有瀏覽活動);
它不會阻止網(wǎng)站查看你的實際位置;
當(dāng)你關(guān)閉網(wǎng)頁時,你在隱私瀏覽或隱身模式下保存的任何書簽都不會消失,它會被添加到你的正常瀏覽網(wǎng)頁的書簽中;
關(guān)閉窗口時不會刪除你在私密瀏覽時下載到計算機的文件。
隱私模式使用現(xiàn)狀
2017 年,DuckDuckGo[4]對 5,710 名美國人進行了瀏覽器隱私模式調(diào)查,以了解人們對隱私模式的認識以及他們?nèi)绾问褂眠@一常見的隱私功能,完整報告可參考:A Study on Private Browsing: Consumer Usage, Knowledge, and Thoughts[5]。
簡單總結(jié)如下:
46% 的美國人使用過隱私瀏覽;
人們使用隱私瀏覽的第一個原因是“令人尷尬的搜索”;
76% 使用隱私瀏覽的美國人無法準(zhǔn)確識別其提供的隱私優(yōu)勢;

65% 的受訪者表示,在了解隱私瀏覽的局限性后(隱私瀏覽模式只會阻止你的瀏覽器歷史記錄被記錄在你的計算機上,并不會提供任何額外的保護),他們感到“驚訝”、“誤導(dǎo)”、“困惑”或“受到傷害”;

84% 的美國人會考慮嘗試使用另一個主要的網(wǎng)絡(luò)瀏覽器,如果它能提供更多功能來幫助保護他們的隱私的話。
參考資料:Is Private Browsing Really Private?[6]
從技術(shù)視角看隱身模式
用戶訪問網(wǎng)站的過程
一般情況下,用戶訪問網(wǎng)站的過程如下圖所示:
當(dāng)一位用戶瀏覽網(wǎng)頁時,一般會進行以下操作:
打開瀏覽器,輸入網(wǎng)址。這時候瀏覽器就會默默將此過程保留在歷史記錄中;
連接請求通過用戶家中的網(wǎng)線,層層遞進,到達互聯(lián)網(wǎng)供應(yīng)商的主干網(wǎng)絡(luò),再接著連接到用戶請求的網(wǎng)站地址,這個時候就網(wǎng)站就能拿到用戶的 IP 地址了;
網(wǎng)站返回數(shù)據(jù)給用戶,網(wǎng)頁大部分的內(nèi)容作為臨時文件被暫存在用戶電腦中;
用戶如果進行注冊/登錄,則會將用戶信息保存/更新在服務(wù)器端。將 Cookie 保留在本地作為驗證用戶的一種方式,避免用戶多次反復(fù)的登錄。當(dāng)然進行注冊時填寫的手機號、郵箱、家庭住址也會被瀏覽器記錄,方便用戶下次調(diào)用。
可以看到整個過程一般而言有 3 種數(shù)據(jù)是保存在用戶的電腦上的,那就是瀏覽記錄、臨時文件與 Cookie 和表單填寫的內(nèi)容。而有 1 或 2 種的數(shù)據(jù)被保留在了網(wǎng)站那邊,就是 IP 地址和用戶填寫的注冊信息。
現(xiàn)在非常多的公司和學(xué)校建立了專有的網(wǎng)絡(luò)環(huán)境,對外只顯示 1 個 IP,數(shù)據(jù)返回的時候再發(fā)送到相應(yīng)的內(nèi)網(wǎng) IP 上。雇主和學(xué)校有心想看的話還是能夠知道內(nèi)網(wǎng)的某個人瀏覽了什么。對于 HTTP 網(wǎng)站鏈接,雇主和學(xué)校能夠完整的了解用戶瀏覽了哪些網(wǎng)站,用戶看了哪些內(nèi)容,停留了多久,針對哪些網(wǎng)站進行了點擊跳轉(zhuǎn)等等;對于 HTTPS 網(wǎng)站鏈接,由于證書的存在和相應(yīng)的驗證機制,一般而言 HTTPS 解密(中間人攻擊)很難發(fā)動,所以只能夠了解到用戶瀏覽了哪些網(wǎng)站而已。同時不恰當(dāng)?shù)木W(wǎng)絡(luò)環(huán)境也會將自己的瀏覽記錄暴露在他人的視野中,比如免費公用的 Wi-Fi。
瀏覽器隱身模式檢測的博弈
在 Chrome 76 之前,存在一個漏洞,許多網(wǎng)站利用該漏洞來檢測用戶是否在 Chrome 的隱身模式下訪問網(wǎng)站。這些網(wǎng)站只需要嘗試使用 FileSystem API?用于存儲臨時或永久文件的 。此 API 在隱身模式下被禁用,但在非隱身模式下存在,因此產(chǎn)生了差異,該差異被利用來檢測用戶是否正在使用隱身模式瀏覽網(wǎng)站并阻止這些用戶查看網(wǎng)站的內(nèi)容。
const?fs?=?window.RequestFileSystem?||?window.webkitRequestFileSystem;
if?(!fs)?{
??console.log('check?failed?');
}?else?{
??fs(
????window.TEMPORARY,
????100,
????console.log.bind(console,?'not?in?incognito?mode'),
????console.log.bind(console,?'incognito?mode')
??);
}
復(fù)制代碼
后來谷歌修復(fù)了一個漏洞,不幸的是,他們的修復(fù)導(dǎo)致了另外兩種方法,仍然可以用來檢測訪問者何時進行私密瀏覽。
基于文件系統(tǒng)大小檢測隱身模式:該方法基于為瀏覽器使用的內(nèi)部文件系統(tǒng)預(yù)留的存儲量。安全研究人員 Vikas Mishra發(fā)現(xiàn)[7],Chrome 隱身模式和非隱身模式之間存儲配額存在區(qū)別,如果臨時存儲配額<= 120MB,那么可以肯定地說它是一個隱身窗口。這個方法主要通過
navigator.storage.estimate
API 來進行獲取和判斷。
if?('storage'?in?navigator?&&?'estimate'?in?navigator.storage)?{
??const?{?usage,?quota?}?=?await?navigator.storage.estimate();
??console.log(`Using?${usage}?out?of?${quota}?bytes.`);
??if?(quota?<?120000000)?{
????console.log('Incognito');
??}?else?{
????console.log('Not?Incognito');
??}
}?else?{
??console.log('Can?not?detect');
}
復(fù)制代碼
通過訪問時間檢測隱身模式:在讀取和寫入數(shù)據(jù)時,內(nèi)存文件系統(tǒng)總是比磁盤文件系統(tǒng)快。在隱身模式下,Chrome 會將寫入 API 的數(shù)據(jù)存儲在內(nèi)存中,而不是像在正常模式下那樣將數(shù)據(jù)持久化到磁盤。這種新的檢測方法是由研究員Jesse Li[8]?發(fā)現(xiàn)的,它測量對瀏覽器文件系統(tǒng)的一系列寫入。根據(jù)這些寫入的速度,網(wǎng)站理論上可以確定瀏覽器是否使用隱身模式。防止這種檢測方法的唯一方法是讓隱身模式和普通模式使用相同的存儲介質(zhì),以便 API 無論如何都以相同的速度運行。
Chrome 開發(fā)人員看到了這兩點:在 2018 年 3 月的設(shè)計文檔中,他們確定了基于時間和文件系統(tǒng)大小檢測隱私模式的風(fēng)險,并進行了替代實現(xiàn):只將元數(shù)據(jù)保存在內(nèi)存中,并加密磁盤上的文件。這將解決網(wǎng)站使用時間來區(qū)分內(nèi)存和磁盤存儲的風(fēng)險,并消除基于文件系統(tǒng)大小和文件系統(tǒng)類型(臨時與持久)的差異。
然而,這樣的解決方案有其自身的權(quán)衡。雖然它可以抵御隱私模式檢測,但它會留下元數(shù)據(jù):即使數(shù)據(jù)本身無法解密,它的存在也提供了隱身使用的證據(jù)。
如果我們考慮隱身模式的威脅模型,其主要目的是保護同一設(shè)備的其他用戶的隱私,而不是您訪問的網(wǎng)站的隱私,這種權(quán)衡可能是不值得的。
隱私模式下如何標(biāo)識用戶
設(shè)備唯一標(biāo)識與瀏覽器指紋
我們都知道,瀏覽器隱身模式可以讓別人無法知道你都訪問了什么網(wǎng)站和做了什么操作,在隱身模式下,打開的網(wǎng)頁和加載的文件不會記錄到你的瀏覽歷史記錄以及加載歷史記錄中。在你關(guān)閉打開的全部隱身窗口后,系統(tǒng)會刪除所有新 Cookie。但是,做為程序猿的我們,如果有類似以下場景:
當(dāng)產(chǎn)品和數(shù)據(jù)分析師需要更精準(zhǔn)的數(shù)據(jù)時;
當(dāng)無需登陸的頁面(如社區(qū)文章)需要杜絕隱身模式刷 UV 訪問量時;
當(dāng)無需登陸的投票站點需要杜絕隱身模式反復(fù)投票點贊時;
當(dāng)無需登陸的問卷類網(wǎng)站,需要限制用戶只能進行一次問卷提交或者第二次打開,需要展示前次提交的結(jié)果時;
...

前端印象
零一,分享技術(shù),不止前端
公眾號
這對我們來說,無疑是一個巨大的困擾,我們或許都知道設(shè)備唯一標(biāo)識的概念,但在瀏覽器端,在隱身模式下,在無需用戶額外授權(quán)時,我們該如何拿到設(shè)備唯一標(biāo)識呢?
在開發(fā)場景下,唯一的標(biāo)識一個設(shè)備是一個基本功能,可以擁有很多應(yīng)用場景,比如軟件授權(quán)(如何保證你的軟件在授權(quán)后才能在特定機器上使用)、軟件 License,設(shè)備標(biāo)識,設(shè)備身份識別等。
如果說要獲取設(shè)備唯一標(biāo)識,也許你會想到類似 IMEI、Android ID、MAC 地址等思路,但是Android 10 中官方文檔[9]?中有以下兩個表述:
從 Android 10 開始,應(yīng)用必須具有?
READ_PRIVILEGED_PHONE_STATE
?特許權(quán)限才能訪問設(shè)備的不可重置標(biāo)識符(包含 IMEI 和序列號)。默認情況下,在搭載 Android 10 或更高版本的設(shè)備上,系統(tǒng)會傳輸隨機分配的 MAC 地址。
一個電腦可能存在多個網(wǎng)卡,多個 MAC 地址,MAC 地址另外一個更加致命的弱點是,MAC 地址很容易手動更改。
至于 Android ID,則不具有真正的唯一性,ROOT、刷機、恢復(fù)出廠設(shè)置、不同簽名的應(yīng)用等都會導(dǎo)致獲取的 Android ID 發(fā)生改變,并且不同廠商定制的系統(tǒng)的 BUG 會導(dǎo)致不同的設(shè)備可能會產(chǎn)生相同的 Android ID。
其他一些獲取設(shè)備唯一標(biāo)識的方法,這篇文章有比較全面的論述:
獲取設(shè)備唯一標(biāo)識(Unique Identifier):Windows 系統(tǒng)[10]
廣告商是如何追蹤我們?日常使用手機該怎樣保護隱私[11]這篇文章有一張圖則是一個更好的匯總:

而如果回到我們前端場景下,以上這些方法又多了很多局限性,比如有的需要特許權(quán)限,有的需要依賴于原生開發(fā)的配合,那么,有沒有一種只需要前端參與,也可以獲得不錯的準(zhǔn)確率的唯一標(biāo)識方案呢?—— 此時就到了瀏覽器指紋登場的時候了。
FingerPrint 即我們常說的指紋識別,使用手指和拇指前端的紋理按下的紋印來鑒定身份。指紋是鑒別身份的一種可靠的方法,具有唯一性,因為每個人的每個指頭上的紋理排列各不相同而且不因發(fā)育或年齡而改變。而瀏覽器指紋是指僅通過瀏覽器的各種信息,如 CPU 核心數(shù)、顯卡信息、系統(tǒng)字體、屏幕分辨率、瀏覽器插件等組合成的一個字符串,就能近乎絕對定位一個用戶,就算使用瀏覽器的隱私窗口模式,也無法避免。
這是一個被動的識別方式。也就是說,理論上你訪問了某一個網(wǎng)站,那么這個網(wǎng)站就能識別到你,雖然不知道你是誰,但你有一個唯一的指紋,將來無論是廣告投放、精準(zhǔn)推送、安全防范,還是其他一些關(guān)于隱私的事情,都非常方便。
瀏覽器指紋的技術(shù)點與分類
基本指紋:瀏覽器基本指紋是任何瀏覽器都具有的特征標(biāo)識,比如 UserAgent、屏幕分辨率、CPU 核心數(shù)、內(nèi)存大小、瀏覽器插件及擴展、瀏覽器設(shè)置、語言、硬件類型、操作系統(tǒng)、時區(qū)、地理位置、DNS、SSL 證書等眾多信息,這些指紋信息“類似”人類的身高、年齡等,有很大的沖突概率,只能作為輔助識別??梢栽谶@個網(wǎng)址[12]進行查看本地瀏覽器的基本特征。
高級指紋:瀏覽器高級指紋與基本指紋的區(qū)別是:基本指紋就像是人的外貌特征,外貌可以用男女、身高、體重區(qū)分,然而這些特征不能對某個人進行唯一性標(biāo)識,僅使用基本指紋也無法對客戶端進行唯一性判定,基于 HTML5 的諸多高級功能就能生成高級指紋了。高級指紋包括 Canvas 指紋、Webgl 指紋、AudioContext 指紋、WebRTC 指紋、字體指紋等;
綜合指紋:零散的指紋信息并不能真正的定位到唯一用戶,并不能用來代表一個用戶的唯一身份(用戶指紋)。綜合指紋是指將所有的用戶瀏覽器信息組合起來,就可以近乎 99%以上的準(zhǔn)確率定位標(biāo)識用戶。將基本指紋和高級指紋組合起來就可以生成綜合指紋(用戶指紋),這樣就可以達到接近 99%以上定位唯一用戶了。
更多關(guān)于高級指紋的細節(jié)和原理,可以通過探討瀏覽器指紋[13]這篇文章進行了解。
BrowserLeaks
長期以來,人們一直認為 IP 地址和 Cookie 是用于在線跟蹤人員的唯一可靠數(shù)字指紋。但過了一段時間,當(dāng)現(xiàn)代網(wǎng)絡(luò)技術(shù)允許感興趣的組織在他們不知情且無法避免的情況下使用新方法來識別和跟蹤用戶時,事情就失控了。
BrowserLeaks[14]就是關(guān)于瀏覽隱私和網(wǎng)絡(luò)瀏覽器指紋的。在這里,你將找到一個 Web 技術(shù)安全測試工具庫,這些工具將向你展示哪些類型的個人身份數(shù)據(jù)可能會被泄露,以及如何保護自己免受此類泄露。這個網(wǎng)站提供了包括 IP 地址、地理位置、Canvas、WebGL、WebRTC、字體等多種類型指紋的查看及其基本原理概述。

如果你對其中的技術(shù)原理很感興趣,可以進入BrowserLeaks[15],點擊對應(yīng)卡片標(biāo)題進行查看和了解,比如?HTML5 Canvas Fingerprinting[16]頁面,會給出你的 Canvas 指紋及其唯一性率等信息。

Nothing Private 的識別原理
前面的章節(jié)「瀏覽器隱身模式真的可以隱身嗎?」中介紹了Nothing Private[17]這個站點的測試結(jié)果,我們也看到,在提交信息和校驗的時候,請求會攜帶一個finger
字段,這個字段就可以被認為是“瀏覽器指紋”。
查看 GitHub 上Nothing Private 的源碼[18]可以發(fā)現(xiàn),Nothing Private 實現(xiàn)“瀏覽器指紋”的核心邏輯如下:

顯而易見,Nothing Private 使用?ClientJS[19](用純 JavaScript 編寫的設(shè)備信息和數(shù)字指紋)的瀏覽器指紋識別功能來獲取你的 Web 瀏覽器的指紋,核心方法在于getFingerprint
。當(dāng)你提交表單時,此指紋與你填寫的標(biāo)識一起保存在使用 PHP 作為后端的 MySQL 數(shù)據(jù)庫中。下次你訪問該網(wǎng)站時,你的瀏覽器指紋將與數(shù)據(jù)庫中的列匹配,并返回你填寫的標(biāo)識。
ClientJS 當(dāng)前用于生成指紋的數(shù)據(jù)點包括:
user?agent,?screen?print,?color?depth,?current?resolution,?available?resolution,?device?XDPI,?device?YDPI,?plugin?list,
font?list,?local?storage,?session?storage,?timezone,?language,?system?language,?cookies,?canvas?print
復(fù)制代碼
我們還是瀏覽一下 ClientJS 的`getFingerprint`基本邏輯[20]:
我們發(fā)現(xiàn),getFingerprint
會獲取 UA、cookie、本地存儲、canvas 指紋等信息,再經(jīng)過Murmur Hash
?算法加密,最終返回一個可以唯一標(biāo)識瀏覽器設(shè)備的“瀏覽器指紋”。
MurmurHash 是一種非加密型哈希函數(shù),適用于一般的哈希檢索操作。由 Austin Appleby 在 2008 年發(fā)明, 并出現(xiàn)了多個變種,都已經(jīng)發(fā)布到了公有領(lǐng)域(public domain)。與其它流行的哈希函數(shù)相比,對于規(guī)律性較強的 key,MurmurHash 的隨機分布特征表現(xiàn)更良好。
ClientJS 官網(wǎng)地址[21]
FingerprintJS
FingerprintJS?是一個快速的瀏覽器指紋庫,純?JavaScript
?實現(xiàn),沒有任何依賴。默認情況下,使用?Murmur Hash
?算法返回一個 32 位整數(shù),Hash 函數(shù)可以很容易地更換。同時,他也很輕量:開啟?gzipped
?后只有?843 bytes
,匿名識別網(wǎng)絡(luò)瀏覽器的準(zhǔn)確率高達?94%
。
FingerprintJS 的使用也比較簡單:
import?FingerprintJS?from?'@fingerprintjs/fingerprintjs';
//?應(yīng)用啟動時初始化:Initialize an agent at application startup.
const?fpPromise?=?FingerprintJS.load();
(async?()?=>?{
??//?Get?the?visitor?identifier?when?you?need?it.
??const?fp?=?await?fpPromise;
??const?result?=?await?fp.get();
??//?This?is?the?visitor?identifier:
??const?visitorId?=?result.visitorId;
??console.log(visitorId);
})();
復(fù)制代碼
更多關(guān)于 fingerprintJS 的信息,可以參考:
fingerprintJS 介紹與使用[22]
fingerprintJS - GitHub[23]
fingerprintJS - 官方文檔[24]
上面這些方法,能獲得九成以上意義的唯一瀏覽器指紋,也許并不能完全真的唯一,因為比如重寫相關(guān) canvas 方法、使用類似貓頭鷹瀏覽器[25]等特殊瀏覽器還是會使得相關(guān)方法失效,但是技術(shù)手段更多時候只是一個通用意義上的解決方案,增加破解的壁壘和成本,我認為支持常用場景下的開發(fā)是足夠的了。
有了唯一的瀏覽器指紋,我們就可以在類似統(tǒng)計 UV、點贊、投票的時候,帶上相關(guān)指紋,自然就可以在極大程度上辨別用戶是否存在刷票、刷訪問量的行為了,不過,瀏覽器指紋技術(shù)終歸是把雙刃劍,在解決以上問題的同時,難免會給用戶帶來更多的信息泄漏困擾。
實現(xiàn) Canvas Fingerprinting
**Canvas Fingerprinting(Canvas 指紋)基于 Canvas 繪制特定內(nèi)容的圖片,使用 canvas.toDataURL()方法返回該圖片內(nèi)容的 base64 編碼字符串。對于 PNG 文件格式,以塊(chunk)劃分,最后一塊是一段 32 位的 CRC 校驗,提取這段 CRC 校驗碼便可以用于用戶的唯一標(biāo)識。**Canvas 利用 HTML5 canvas API 和 JavaScript 來動態(tài)生成你想要的圖像。和其它跟蹤技術(shù)一樣,這種方法已被成千上萬的網(wǎng)站采用了,包括我們熟知的廣告領(lǐng)域。
下面是 Canvas 指紋的一個簡單實現(xiàn),原理其實比較簡單,不理解的地方可以參考注釋:
// PHP 中,bin2hex()?函數(shù)把 ASCII 字符的字符串轉(zhuǎn)換為十六進制值。字符串可通過使用 pack()?函數(shù)再轉(zhuǎn)換回去
//?下面是PHP?的?bin2hex?的?JavaScript?實現(xiàn)
function?bin2hex(s)?{
??let?n,
????o?=?'';
??s?+=?'';
??for?(let?i?=?0,?l?=?s.length;?i?<?l;?i++)?{
????n?=?s.charCodeAt(i).toString(16);
????o?+=?n.length?<?2???'0'?+?n?:?n;
??}
??return?o;
}
//?獲取指紋UUID
function?getUUID(domain)?{
??//?創(chuàng)建?<canvas>?元素
??let?canvas?=?document.createElement('canvas');
??//?getContext()?方法可返回一個對象,該對象提供了用于在畫布上繪圖的方法和屬性
??let?ctx?=?canvas.getContext('2d');
??//?設(shè)置在繪制文本時使用的當(dāng)前文本基線
??ctx.textBaseline?=?'top';
??//?設(shè)置文本內(nèi)容的當(dāng)前字體屬性
??ctx.font?=?"14px?'Arial'";
??//?設(shè)置用于填充繪畫的顏色、漸變或模式
??ctx.fillStyle?=?'#f60';
??//?繪制"被填充"的矩形
??ctx.fillRect(125,?1,?62,?20);
??ctx.fillStyle?=?'#069';
??//?在畫布上繪制"被填充的"文本
??ctx.fillText(domain,?2,?15);
??ctx.fillStyle?=?'rgba(102,?204,?0,?0.7)';
??ctx.fillText(domain,?4,?17);
??//?toDataURL返回一個包含圖片展示的?data?URI
??let?b64?=?canvas.toDataURL().replace('data:image/png;base64,',?'');
??// atob()?方法用于解碼使用 base-64 編碼的字符串;base-64 編碼使用方法是 btoa(),這倆都是window全局方法
??let?crc?=?bin2hex(atob(b64).slice(-16,?-12));
??return?crc;
}
//?調(diào)用時,你可以傳入任何你想傳的字符串,并不局限于傳遞domain,這里只是為了便于區(qū)分站點
console.log(getUUID('https://www.baidu.com/'));
復(fù)制代碼
PHP bin2hex() 函數(shù)[26]
測試結(jié)果表明,同一瀏覽器訪問該域時生成的 CRC 校驗碼總是不變??梢院唵卫斫鉃?strong>同樣的 HTML Canvas 元素繪制操作,在不同的操作系統(tǒng)不同的瀏覽器上,產(chǎn)生的圖片內(nèi)容其實是不完全相同的。出現(xiàn)這種情況可能是有幾個原因:
在圖片格式上,不同 web 瀏覽器使用了不同的圖形處理引擎、不同的圖片導(dǎo)出選項、不同的默認壓縮級別等。
在像素級別來看,操作系統(tǒng)各自使用了不同的設(shè)置和算法來進行抗鋸齒和子像素渲染操作。
即使是相同的繪圖操作,最終產(chǎn)生的圖片數(shù)據(jù)在 hash 層面上依然是不同的。
如何更好的保護個人隱私
我們應(yīng)該在何時使用私密/隱身模式?
隱身模式就是能夠在多人共用電腦的時候保護自己的瀏覽記錄不被其他公用的人看到,以及保護自己的賬戶不被惡意登錄。此外隱私模式還能保護我們不被惡意廣告所困擾。
即使你使用的是隱私瀏覽模式,也并不意味著你可以做一些邪惡的事情;
也許你想將你的工作和個人生活分開;
你可能會共用一臺計算機或設(shè)備,并且你不希望你的家人、朋友、同事窺探;
你可能正在購買禮物,但你不希望任何東西破壞可能的驚喜;
或者,也許你只是想限制公司收集有關(guān)你的數(shù)據(jù)量,并且你重視隱私;
使用公共場所的電腦設(shè)備時。
如何防止被生成“瀏覽器指紋”?
上一大節(jié)我們探討了網(wǎng)站如何使用各種技術(shù)來生成“瀏覽器指紋”來標(biāo)識唯一用戶,那么下面我們來說說,如何避免被網(wǎng)站“生成”唯一用戶指紋。
常用的手段是,通過瀏覽器的擴展插件,阻止網(wǎng)站獲取各種信息,或者返回個假的數(shù)據(jù),這種方式是在網(wǎng)頁加載前就執(zhí)行一段 JS 代碼,更改、重寫、HOOK 了 js 的各個函數(shù)來實現(xiàn)的,因為 JS 的靈活性給這種方式提供了可能。但是這種方式始終是表層的,使用 JS 修改是能防止大部分網(wǎng)站生成唯一指紋,但是是有手段可以檢測出來是否“作弊”的。
更好的手段是從瀏覽器底層做處理,從瀏覽器底層修改 API 使得這些在 js 層獲取的信息并不唯一,不管如何組合都不能生成一個唯一的代表用戶的指紋。比如:貓頭鷹瀏覽器[27]。
貓頭鷹瀏覽器是基于 chromium 代碼修改編譯的瀏覽器,從底層對各種 API 做了修改,可以交給用戶自定義返回各種數(shù)據(jù),比如 Canvas、Webgl、AudioContext、WebRTC、字體、UserAgent、屏幕分辨率、CPU 核心數(shù)、內(nèi)存大小、插件信息、語言等信息,這樣就可以完全避免被“生成”唯一用戶指紋了。因為在線公司、廣告商和開發(fā)人員喜歡跟蹤你的在線活動和操作,以便為你提供有針對性的廣告,通常,大家認為這是侵犯用戶隱私的。
如何免受廣告跟蹤器的監(jiān)視和跟蹤
禁用第三方 Cookie。Chrome 2020 年推了一個叫做 SameSite Cookie 的東西,目的是為了減少第三方 Cookie 的發(fā)送,但網(wǎng)站所有者仍然有能力關(guān)掉它(SameSite=None
),可參考下圖。而 Chrome 的終極目標(biāo),是要在 2022 年完全消滅第三方 Cookie,像 Safari 和 Brave 已經(jīng)做的那樣,SameSite Cookie 就是第一步。
禁用 JavaScript 腳本,蒽,這個在現(xiàn)今,估計還是算了。在現(xiàn)在前后端分離的開發(fā)模式下,大多數(shù)網(wǎng)站在禁用 JavaScript 后,將什么也沒有,得,煩惱沒有了,網(wǎng)站內(nèi)容也沒有了,一了百了~
要隱藏你的互聯(lián)網(wǎng)流量以免受監(jiān)控和跟蹤,你可以使用虛擬專用網(wǎng)絡(luò) (VPN)。你的 ISP 會知道你正在使用 VPN,但它無法確定你正在訪問哪些網(wǎng)站。VPN 服務(wù)通過遠程服務(wù)器路由流量,因此看起來你是從另一個位置或多個位置進行瀏覽。不過,VPN 提供商可以跟蹤你上網(wǎng)的位置,因此最好找一家你可以信任的公司來刪除或鎖定你的瀏覽活動。VPN 不會阻止來自廣告商的第三方 cookie,但這些 cookie 將無法準(zhǔn)確識別你的位置,從而使廣告跟蹤器難以或不可能有效。
友情提示:VPN 是中立性的技術(shù),使用由相關(guān)單位構(gòu)建并且登記備案的 VPN?不屬于違法行為,而私自搭建的則屬于違法行為(即使用非法 VPN 是違法的);如果只是使用 VPN 連接國際網(wǎng)絡(luò)進行必要的工作、查閱必要信息,是不屬于違法行為的;如果使用 VPN 在國際互聯(lián)網(wǎng)制作、復(fù)制、查閱和傳播違法信息的,則需要依法追究違法責(zé)任。
Tor 瀏覽器可以真正掩蓋你的在線活動。TorBrowser 是一款匿名訪問網(wǎng)絡(luò)的的軟件,用戶通過 Tor 可以在因特網(wǎng)上進行匿名交流。為了實現(xiàn)匿名目的,Tor 把分散在全球的計算機連起來形成一個加密回路。當(dāng)你通過 Tor 網(wǎng)絡(luò)訪問互聯(lián)網(wǎng)時,你的網(wǎng)絡(luò)數(shù)據(jù)會通過多臺電腦迂回發(fā)送,就像洋蔥包裹其核心那樣掩飾你的網(wǎng)絡(luò)活動,使得跟蹤流量變得困難,你訪問的網(wǎng)站真的不知道你在哪里,只知道你的請求路由通過的最后一個服務(wù)器的大致位置;信息傳輸在每一步都被加密,無從得知你所處位置和信息傳輸目的地。因此 Tor Browser 也被稱為洋蔥瀏覽器,Tor 瀏覽器在關(guān)閉時會刪除所有 cookie,但是即使 Tor 代理也不會阻止第三方廣告商在你的瀏覽器中注入 cookie。
參考資料
探討瀏覽器指紋[28]
瀏覽器的隱私模式,真的能完全保護我們的隱私嗎?[29]
Google Chrome Incognito Mode Can Still Be Detected by These Methods[30]
Private Browsing Won't Protect You From Everything[31]
本文首發(fā)于個人博客[32],歡迎指正和star[33]。
參考資料
[1]
How do I set my browser to Incognito or private mode?:?https://link.juejin.cn?target=https%3A%2F%2Fwww.computerhope.com%2Fissues%2Fch001378.htm
[2]
Nothing Private:?https://link.juejin.cn?target=https%3A%2F%2Fwww.nothingprivate.ml%2F
[3]
Nothing Private:?https://link.juejin.cn?target=https%3A%2F%2Fwww.nothingprivate.ml%2F
[4]
DuckDuckGo:?https://link.juejin.cn?target=https%3A%2F%2Fduckduckgo.com%2F
[5]
A Study on Private Browsing: Consumer Usage, Knowledge, and Thoughts:?https://link.juejin.cn?target=https%3A%2F%2Fduckduckgo.com%2Fdownload%2FPrivate_Browsing.pdf
[6]
Is Private Browsing Really Private?:?https://link.juejin.cn?target=https%3A%2F%2Fspreadprivacy.com%2Fis-private-browsing-really-private%2F
[7]
發(fā)現(xiàn):?https://link.juejin.cn?target=https%3A%2F%2Fmishravikas.com%2Farticles%2F2019-07%2Fbypassing-anti-incognito-detection-google-chrome.html
[8]
Jesse Li:?https://link.juejin.cn?target=https%3A%2F%2Fblog.jse.li%2Fposts%2Fchrome-76-incognito-filesystem-timing%2F
[9]
Android 10 中官方文檔:?https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.android.google.cn%2Fabout%2Fversions%2F10%2Fprivacy%2Fchanges
[10]
獲取設(shè)備唯一標(biāo)識(Unique Identifier):Windows 系統(tǒng):?https://link.juejin.cn?target=https%3A%2F%2Fblog.csdn.net%2Fqq_32403473%2Farticle%2Fdetails%2F81505664
[11]
廣告商是如何追蹤我們?日常使用手機該怎樣保護隱私:?https://link.juejin.cn?target=https%3A%2F%2Fxw.qq.com%2Fcmsid%2F20190118A11VT5%2F20190118A11VT500
[12]
這個網(wǎng)址:?https://link.juejin.cn?target=https%3A%2F%2Fwww.whatismybrowser.com%2F
[13]
探討瀏覽器指紋:?https://link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F282922459
[14]
BrowserLeaks:?https://link.juejin.cn?target=https%3A%2F%2Fbrowserleaks.com%2F
[15]
BrowserLeaks:?https://link.juejin.cn?target=https%3A%2F%2Fbrowserleaks.com%2F
[16]
HTML5 Canvas Fingerprinting:?https://link.juejin.cn?target=https%3A%2F%2Fbrowserleaks.com%2Fcanvas
[17]
Nothing Private:?https://link.juejin.cn?target=https%3A%2F%2Fwww.nothingprivate.ml%2F
[18]
Nothing Private 的源碼:?https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fgautamkrishnar%2Fnothing-private%2Fblob%2F794bf714af5bbe5b1c69abfbb3566afd90a8474a%2Fmain.js
[19]
ClientJS:?https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fjackspirou%2Fclientjs
[20]
getFingerprint
基本邏輯:?https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fjackspirou%2Fclientjs%2Fblob%2F92d4df728f5a7085da582565e3e616d8c8ac9529%2Fsrc%2Fclient.base.js
[21]
ClientJS 官網(wǎng)地址:?https://link.juejin.cn?target=http%3A%2F%2Fclientjs.org%2F
[22]
fingerprintJS 介紹與使用:?https://link.juejin.cn?target=http%3A%2F%2Fvalve.github.io%2Ffingerprintjs%2F
[23]
fingerprintJS - GitHub:?https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Ffingerprintjs%2Ffingerprintjs
[24]
fingerprintJS - 官方文檔:?https://link.juejin.cn?target=https%3A%2F%2Ffingerprintjs.com%2F
[25]
貓頭鷹瀏覽器:?https://link.juejin.cn?target=https%3A%2F%2Fwww.owlssky.com%2F
[26]
PHP bin2hex() 函數(shù):?https://link.juejin.cn?target=https%3A%2F%2Fwww.runoob.com%2Fphp%2Ffunc-string-bin2hex.html
[27]
貓頭鷹瀏覽器:?https://link.juejin.cn?target=https%3A%2F%2Fwww.owlssky.com%2F
[28]
探討瀏覽器指紋:?https://link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F282922459
[29]
瀏覽器的隱私模式,真的能完全保護我們的隱私嗎?:?https://link.juejin.cn?target=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F36712219
[30]
Google Chrome Incognito Mode Can Still Be Detected by These Methods:?https://link.juejin.cn?target=https%3A%2F%2Fwww.bleepingcomputer.com%2Fnews%2Fgoogle%2Fgoogle-chrome-incognito-mode-can-still-be-detected-by-these-methods%2F
[31]
Private Browsing Won't Protect You From Everything:?https://link.juejin.cn?target=https%3A%2F%2Fwww.pcmag.com%2Fnews%2Fprivate-browsing-wont-protect-you-from-everything
[32]
個人博客:?https://link.juejin.cn?target=https%3A%2F%2Fking-hcj.github.io%2F2021%2F08%2F08%2FIncognito-Mode%2F
[33]
指正和star:?https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fking-hcj%2Fking-hcj.github.io