瀏覽器指紋如何識(shí)別來(lái)自網(wǎng)絡(luò)爬蟲的流量
一、識(shí)別網(wǎng)絡(luò)爬蟲流量的必要性
在互聯(lián)網(wǎng)上識(shí)別用戶身份和獲取用戶資料是一種尋常的行為,為特定用戶推送和定制不同內(nèi)容也較為普遍。但事實(shí)上,在互聯(lián)網(wǎng)存在海量的虛假流量,它們通常被用來(lái)大批量、分布式地采集網(wǎng)頁(yè)信息,進(jìn)行模擬登陸,模仿用戶行為進(jìn)而規(guī)避被封禁的風(fēng)險(xiǎn)。虛假流量的主體是網(wǎng)絡(luò)爬蟲,網(wǎng)絡(luò)爬蟲(Web Crawlers)是機(jī)器人的一種,用于將公開化的網(wǎng)絡(luò)數(shù)據(jù)的搜集自動(dòng)化[1]。雖然有些爬蟲會(huì)在被爬取網(wǎng)站的同意下搜集信息,但是大多數(shù)網(wǎng)絡(luò)爬蟲并不遵循網(wǎng)絡(luò)條款。
目前應(yīng)用最廣的網(wǎng)絡(luò)條款是robots.txt,其目的在于告訴爬蟲機(jī)器人網(wǎng)站的哪些頁(yè)面可以爬取,哪些頁(yè)面不允許被爬取,該條款只用于聲明,而不能強(qiáng)制迫使網(wǎng)絡(luò)爬蟲遵循其規(guī)定。如下圖是百度的部分robots.txt:
圖片
圖1 百度部分robots.txt展示
二、使用瀏覽器指紋識(shí)別網(wǎng)絡(luò)爬蟲的必要性
目前網(wǎng)絡(luò)上針對(duì)網(wǎng)絡(luò)爬蟲有多種反制措施,比如網(wǎng)絡(luò)爬蟲頭部信息檢測(cè)、JavaScript加密參數(shù)、各種驗(yàn)證碼識(shí)別、網(wǎng)頁(yè)代碼混淆等。
1.網(wǎng)絡(luò)爬蟲頭部信息檢測(cè)
這種措施主要是針對(duì)爬蟲程序啟動(dòng)時(shí)沒(méi)有完全模擬瀏覽器頭部信息的情況。比如打開Edge瀏覽器的開發(fā)者工具,在網(wǎng)絡(luò)面板刷新頁(yè)面后可以抓到網(wǎng)絡(luò)數(shù)據(jù)包,打開訪問(wèn)百度頁(yè)面的數(shù)據(jù)包,可以看到大量請(qǐng)求標(biāo)頭:
圖片
圖2 數(shù)據(jù)包請(qǐng)求標(biāo)頭
其中最為常用的便是Cookie,在Cookie中存在用戶的唯一標(biāo)志符,為了防止爬蟲復(fù)用該信息,通常里邊會(huì)存在一些擁有時(shí)效性的時(shí)間戳。這種方法因有可能侵犯隱私而受到一些抵制。此外,User-Agent也被用來(lái)防范網(wǎng)絡(luò)爬蟲,因?yàn)槟J(rèn)的網(wǎng)絡(luò)爬蟲對(duì)于這一頭部信息是缺失的,使用正常瀏覽器訪問(wèn)頁(yè)面會(huì)自帶瀏覽器的信息,而且該信息還被用來(lái)區(qū)分移動(dòng)端和瀏覽器端,面對(duì)不同瀏覽終端,會(huì)給用戶返回不同的頁(yè)面效果。但是這種反爬蟲措施的效果較弱,只要爬蟲將信息復(fù)制完整,在一定時(shí)間內(nèi)依然能夠發(fā)起大量的訪問(wèn)請(qǐng)求。
2.JavaScript加密參數(shù)
JavaScript加密參數(shù)指的是在用戶訪問(wèn)網(wǎng)站的時(shí)候,頭部會(huì)攜帶一些由網(wǎng)站的JavaScript代碼計(jì)算生成的值,該值每次計(jì)算結(jié)果都不盡相同,其主要應(yīng)用常用的前端加密庫(kù)CryptoJS進(jìn)行加密計(jì)算。
這種反爬蟲措施雖然提高了門檻,但是對(duì)于會(huì)閱讀JavaScript代碼的程序員來(lái)說(shuō),依然沒(méi)有任何難度。主要原因在于網(wǎng)站的前端代碼可以直接被用戶獲取,雖然可以有多種禁止用戶單擊右鍵或者打開開發(fā)者工具的措施,但是對(duì)于有編程基礎(chǔ)的人來(lái)說(shuō)形同虛設(shè)。
針對(duì)這種反爬蟲措施,用戶只需將網(wǎng)站的JavaScript加密參數(shù)相關(guān)代碼通過(guò)閱讀進(jìn)行復(fù)現(xiàn),或者直接拷貝下來(lái)進(jìn)行執(zhí)行,再與自己編寫的爬蟲代碼進(jìn)行耦合,依然能夠?qū)崿F(xiàn)對(duì)網(wǎng)站的訪問(wèn)請(qǐng)求。
3.各種驗(yàn)證碼檢測(cè)
目前驗(yàn)證碼檢測(cè)已經(jīng)十分廣泛,從早期的英文數(shù)字驗(yàn)證碼,到現(xiàn)在的漢字點(diǎn)選驗(yàn)證碼、滑塊驗(yàn)證碼等,有眾多的公司專門提供對(duì)應(yīng)的服務(wù),如網(wǎng)易易盾、極驗(yàn)、頂象等,如下圖所示:
圖片
圖3 文字點(diǎn)選驗(yàn)證碼
但是隨著人工智能技術(shù)的發(fā)展,這些驗(yàn)證碼也逐漸拜倒在爬蟲技術(shù)之下。在github上已經(jīng)存在一些成熟的驗(yàn)證碼識(shí)別庫(kù)用于通過(guò)驗(yàn)證碼檢測(cè),比如dddocr,已經(jīng)可以直接調(diào)包識(shí)別英數(shù)驗(yàn)證碼、滑塊驗(yàn)證碼、文字點(diǎn)選驗(yàn)證碼等。即便是沒(méi)有對(duì)應(yīng)的識(shí)別庫(kù),也可以通過(guò)自己搭建深度學(xué)習(xí)環(huán)境來(lái)訓(xùn)練驗(yàn)證碼模型。
4.網(wǎng)頁(yè)代碼混淆
網(wǎng)頁(yè)代碼混淆是用來(lái)拔高JavaScript參數(shù)破解門檻的,包括驗(yàn)證碼識(shí)別在內(nèi),在提交參數(shù)的時(shí)候,都可以通過(guò)JavaScript腳本進(jìn)行參數(shù)加密。網(wǎng)頁(yè)的前端代碼是用戶可以直接獲取的,沒(méi)有秘密可言。網(wǎng)頁(yè)代碼混淆便是使得代碼不可讀,進(jìn)而提高參數(shù)破解難度。下圖是網(wǎng)易易盾的網(wǎng)頁(yè)混淆代碼:
圖片
圖4 網(wǎng)易易盾混淆頁(yè)面
網(wǎng)頁(yè)代碼混淆通常是通過(guò)Babel庫(kù)來(lái)實(shí)現(xiàn)的,因此也存在還原的方法,利用Bbael庫(kù)AST抽象語(yǔ)法樹進(jìn)行還原目前已是成熟的技術(shù)。雖然做不到對(duì)復(fù)雜混淆代碼的完全還原,但也足以攻克加密參數(shù)了。
上述反爬蟲措施都存在或大或小的漏洞,爬蟲總是可以通過(guò)這樣或者那樣的方法來(lái)模擬用戶行為,進(jìn)而發(fā)起網(wǎng)絡(luò)請(qǐng)求。而接下來(lái)本文介紹的瀏覽器指紋技術(shù)則是很好的解決方案。
三、瀏覽器指紋技術(shù)概要
瀏覽器指紋是關(guān)于給定的瀏覽器、設(shè)備、操作系統(tǒng)和用戶的環(huán)境和位置信息的一組信息。[2]這些信息可以直接通過(guò)JavaScript搜集并發(fā)送給網(wǎng)站服務(wù)器。網(wǎng)絡(luò)爬蟲無(wú)法避開這些信息的發(fā)送,如果爬蟲直接復(fù)制了瀏覽器的相關(guān)指紋參數(shù),那么網(wǎng)站主機(jī)就可以根據(jù)指紋來(lái)確定流量是否來(lái)自同一用戶,進(jìn)一步根據(jù)發(fā)送頻率來(lái)限制流量。而且,瀏覽器指紋也可以獲取跨瀏覽器指紋,主要是操作系統(tǒng)信息和一些圖形卡信息,因此同一臺(tái)主機(jī)發(fā)起的請(qǐng)求完全可以被識(shí)別為同一用戶。而這種技術(shù)的好處在于無(wú)法感知,因?yàn)檫@些信息可以直接通過(guò)編程語(yǔ)言的接口來(lái)獲取,不會(huì)留下任何痕跡。
一些常用的指紋主要包括如下幾個(gè)方面:
- 設(shè)備的功能(包括設(shè)備內(nèi)存、顏色深度、邏輯核心、觸控支持、屏幕參數(shù)等);
- 操作系統(tǒng)的參數(shù)(操作系統(tǒng)版本、支持的字體列表、時(shí)區(qū)等);
- 瀏覽器的特征(瀏覽器頭部版本、插件列表、屏幕分辨率、數(shù)據(jù)庫(kù)信息等);
- 圖形卡信息(canvas畫布、WebGL渲染器等)。
獲取上述信息之后,通常不會(huì)把這些信息直接發(fā)送出去,而是對(duì)其進(jìn)行哈希編碼。哈希是指從一個(gè)可變大小的輸入中獲得一個(gè)固定長(zhǎng)度的輸出的過(guò)程。相同的輸入會(huì)有相同的輸出,而且哈希函數(shù)擁有不錯(cuò)的抗碰撞能力,即兩個(gè)不同的輸入很難獲得相同的輸出結(jié)果。利用這一特性,可以很輕易地辨別較長(zhǎng)的瀏覽器指紋是否是來(lái)自同一用戶。
如果要辨別流量是否來(lái)自于同一瀏覽器,只需要把瀏覽器對(duì)應(yīng)的信息搜集后哈希,然后放置于cookie或者一個(gè)單獨(dú)的參數(shù)中,發(fā)送給網(wǎng)站主機(jī)即可。這樣一來(lái),網(wǎng)站面對(duì)來(lái)自同一指紋的頻繁請(qǐng)求,可以及時(shí)進(jìn)行流量攔截。
如果爬蟲程序偽造了不同的瀏覽器頭部信息,網(wǎng)站也可以進(jìn)一步搜集圖形卡信息和操作系統(tǒng)參數(shù),因?yàn)橥慌_(tái)電腦的這些信息是相同的,這樣即便開啟多個(gè)瀏覽器或者偽造不同的瀏覽器頭部也可以輕易被識(shí)別出來(lái)。
四、瀏覽器指紋技術(shù)的缺陷
瀏覽器指紋技術(shù)也存在限制,主要在于用戶的設(shè)備是可以更新和升級(jí)的,一旦進(jìn)行更新和升級(jí),指紋將發(fā)生很大變化。而且如果爬蟲程序識(shí)別到了瀏覽器指紋識(shí)別技術(shù),也可以通過(guò)編寫JavaScript,完全偽造一套指紋環(huán)境,并且不斷隨機(jī)其中的參數(shù),從而達(dá)到生成新指紋的效果。這樣一來(lái),網(wǎng)站針對(duì)同一指紋的請(qǐng)求頻率來(lái)識(shí)別的方案將會(huì)失效。
但是不論如何,瀏覽器指紋依然是目前抵制網(wǎng)絡(luò)爬蟲最堅(jiān)實(shí)的方案。因?yàn)闉g覽器指紋信息是極其繁雜的,網(wǎng)站的瀏覽器指紋檢測(cè)方案可以不斷改進(jìn),并搭配JavaScript參數(shù)加密和混淆,進(jìn)而可以極大增加破解難度。如下圖所示的瀏覽器本身的信息:
圖片
圖5 瀏覽器信息
這些信息都直接包含在瀏覽器的window當(dāng)中。瀏覽器指紋技術(shù)不僅可以檢測(cè)各類信息,也可以偵測(cè)用戶請(qǐng)求網(wǎng)站的時(shí)候,是否存在這些函數(shù)方法。這樣一來(lái),除非爬蟲程序完全將瀏覽器的接口自己實(shí)現(xiàn),進(jìn)行繁重的補(bǔ)環(huán)境操作,否則也沒(méi)有什么爬取數(shù)據(jù)的捷徑可行。
參考文獻(xiàn):
[1] Vastel, A., Rudametkin, W., Rouvoy, R., Blanc, X. (2020, February). FP-Crawlers: Studying the Resilience of Browser Fingerprinting to Block Crawlers. In NDSS Workshop on Measurements, Attacks, and Defenses for the Web (MADWeb’20).
[2] Browser Fingerprint Coding Methods Increasing the Effectiveness of User Identification in the Web Traffic [J] . Marcin Gabryel,Konrad Grzanek,Yoichi Hayashi. Journal of Artificial Intelligence and Soft Computing Research . 2020 (4)