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