瀏覽器指紋技術概要
瀏覽器指紋是關於給定的瀏覽器、裝置、作業系統和使用者的環境和位置資訊的一組資訊。[2]這些資訊可以直接透過JavaScript蒐集併傳送給網站伺服器。網路爬蟲無法避開這些資訊的傳送,如果爬蟲直接複製了瀏覽器的相關指紋引數,那麼網站主機就可以根據指紋來確定流量是否來自同一使用者,進一步根據傳送頻率來限制流量。而且,瀏覽器指紋也可以獲取跨瀏覽器指紋,主要是作業系統資訊和一些圖形卡資訊,因此同一臺主機發起的請求完全可以被識別為同一使用者。而這種技術的好處在於無法感知,因為這些資訊可以直接透過程式語言的介面來獲取,不會留下任何痕跡。
一些常用的指紋主要包括如下幾個方面:
裝置的功能(包括裝置記憶體、顏色深度、邏輯核心、觸控支援、螢幕引數等);
作業系統的引數(作業系統版本、支援的字型列表、時區等);
瀏覽器的特徵(瀏覽器頭部版本、外掛列表、螢幕解析度、資料庫資訊等);
圖形卡資訊(canvas畫布、WebGL渲染器等)。
獲取上述資訊之後,通常不會把這些資訊直接傳送出去,而是對其進行雜湊編碼。雜湊是指從一個可變大小的輸入中獲得一個固定長度的輸出的過程。相同的輸入會有相同的輸出,而且雜湊函式擁有不錯的抗碰撞能力,即兩個不同的輸入很難獲得相同的輸出結果。利用這一特性,可以很輕易地辨別較長的瀏覽器指紋是否是來自同一使用者。
如果要辨別流量是否來自於同一瀏覽器,只需要把瀏覽器對應的資訊蒐集後雜湊,然後放置於cookie或者一個單獨的引數中,傳送給網站主機即可。這樣一來,網站面對來自同一指紋的頻繁請求,可以及時進行流量攔截。
如果爬蟲程式偽造了不同的瀏覽器頭部資訊,網站也可以進一步蒐集圖形卡資訊和作業系統引數,因為同一臺電腦的這些資訊是相同的,這樣即便開啟多個瀏覽器或者偽造不同的瀏覽器頭部也可以輕易被識別出來。
四、瀏覽器指紋技術的缺陷
瀏覽器指紋技術也存在限制,主要在於使用者的裝置是可以更新和升級的,一旦進行更新和升級,指紋將發生很大變化。而且如果爬蟲程式識別到了瀏覽器指紋識別技術,也可以透過編寫JavaScript,完全偽造一套指紋環境,並且不斷隨機其中的引數,從而達到生成新指紋的效果。這樣一來,網站針對同一指紋的請求頻率來識別的方案將會失效。
但是不論如何,瀏覽器指紋依然是目前抵制網路爬蟲最堅實的方案。因為瀏覽器指紋資訊是極其繁雜的,網站的瀏覽器指紋檢測方案可以不斷改進,並搭配JavaScript引數加密和混淆,進而可以極大增加破解難度。如下圖所示的瀏覽器本身的資訊:
這些資訊都直接包含在瀏覽器的window當中。瀏覽器指紋技術不僅可以檢測各類資訊,也可以偵測使用者請求網站的時候,是否存在這些函式方法。這樣一來,除非爬蟲程式完全將瀏覽器的介面自己實現,進行繁重的補環境操作,否則也沒有什麼爬取資料的捷徑可行。