爬蟲與反爬蟲技術
1.爬蟲與反爬蟲的概念
互聯網站點的流量一部分由人類正常訪問行為產生,而高達30%-60%的流量則是由網絡爬蟲產生的,其中一部分包含友好網絡爬蟲,如搜索引擎的爬蟲、廣告程序、第三方合作伙伴程序、Robots協議友好程序等;而并非所有的網絡爬蟲都是友好的,爬蟲流量中仍有約20%~30%的流量來自惡意網絡爬蟲。從網站業務安全的角度,例如文學博客、招聘網站、論壇網站、電商等網站均以文本為商品作為盈利點,而惡意爬蟲則可以通過爬取核心文本從中謀取利益;競品公司還可以通過利用惡意爬蟲爬取商品價格和詳情或者注冊用戶信息后進行同類產品線和價格的研究,通過推出過低價格等手段來破壞市場秩序;對于帶寬有限的中小型網站,高頻、大規模的惡意爬蟲可能會降低網頁加載速度,影響真實用戶的訪問體驗,增加網站帶寬負擔。
由于惡意爬蟲帶來的不利影響,因此出現了爬蟲防御技術-即反爬蟲技術,反爬蟲技術可分為被動防御機制與主動防御機制。
? 被動防御機制:主要是根據檢測結果展開的,如利用HTTP請求頭User-Agent來判斷、攔截爬蟲請求,或對訪問頻率過高的IP地址進行封禁。被動防御存在部分缺陷:被動防御檢測流程和機制單一,無法應對復雜多變的惡意爬蟲,檢測誤判率高,容易造成誤封、漏封。
? 主動防御機制:是主流的爬蟲防御發展方向,通過對網頁底層代碼的持續動態變換,增加服務器行為的“不可預測性”,大幅提升攻擊難度,從而實現了從客戶端到服務器端的全方位“主動防護”。
2.網絡爬蟲技術基本工作流程和基礎架構
與正常人類訪問者使用瀏覽器訪問網頁的工作原理相同,網絡爬蟲也是根據HTTP協議來獲取網頁信息的,其流程主要包括如下步驟:
1)對待抓取的URL進行域名解析;
2)根據HTTP協議,發送HTTP請求來獲取網頁內容。
網絡爬蟲的基礎架構如圖1所示。具體而言,網絡爬蟲首先通過種子URL延伸得到待抓取URL隊列,接著網絡爬蟲從待抓取URL列表中逐個進行讀取,讀取URL的過程中,會將URL進行DNS解析,得到網站服務器的IP地址以及相對路徑,接著再把這個地址交給網頁下載器(負責下載網頁內容的一個模塊),對于下載到本地的網頁,即網頁的源代碼,一方面要將這個網頁存儲到網頁庫中,另一方面要從下載的網頁中再次提取URL地址,新提取出來的URL地址會先在已抓取的URL列表中進行比對,檢查該網頁是否已被抓取,如果網頁沒有被抓取過,就將新的URL地址放入到待抓取的URL列表的末尾,等待被抓取,直至待抓取隊列為空的時候,網絡爬蟲就算完成了抓取的全過程,最后對網頁庫中已下載的網頁進行分析與索引后得到收錄結果。其中所謂種子URL即為最開始選定的URL地址,網站首頁、頻道頁等豐富性內容較多的頁面往往會被作為種子URL。
圖1 網絡爬蟲的基礎架構
3.基于自定義cookie的爬蟲檢測策略
目前的爬蟲檢測技術主要分為以下四類:一是基于日志分析的檢測技術,二是基于訪問模式的檢測技術,三是基于訪問行為的檢測技術,四是基于圖靈測試的檢測技術。
- 基于日志分析的檢測技術是通過對比用戶和爬蟲名單庫的爬蟲的User-Agent關鍵詞、IP地址等信息來檢測爬蟲。
- 基于訪問模式的檢測技術通過尋找人類用戶與爬蟲的不同流量特征,如查詢數量、時間間隔模式、搜索操作頻率等來檢測爬蟲。
- 基于訪問行為的檢測技術大多使用機器學習模型如神經網絡、決策樹等通過訪問者的點擊時間、圖片加載情況以及訪問停留時長等有利特征來對訪問進行分類,從而判斷訪問是否來自爬蟲。
- 基于圖靈測試的檢測技術通過讓訪問者回答一些問題來分析其是否為爬蟲,常見的圖靈測試系統有驗證碼測試。
除了上述四類方法,蜜罐技術(隱藏鏈接)也常被使用,通過在網頁中隱藏一些人眼不能發現但爬蟲訪問能夠訪問但鏈接來識別爬蟲。
基于自定義cookie的檢測技術是一種基于日志分析的主動抵御爬蟲的策略,該策略是通過在網站的接口中增加了一些加密參數來實現的,瀏覽器通過執行返回的JS代碼得到具有時效性以及機密性的結果,并將結果添加到cookie中,再次發起請求時攜帶,正常人類訪問者和惡意爬蟲的訪問過程如圖2所示。
圖2 正常人類訪問者和惡意爬蟲的訪問流程圖
具體而言,向客戶端返回JS代碼,并通過客戶端執行JS代碼的結果來主動抵御爬蟲。cookie的生成過程可以融合客戶端瀏覽器的特性,該特性檢測只有在真實的瀏覽器和真實用戶訪問行為的情況下才能完成,而無法在一些瀏覽器內核模擬器上或者一些偽造了請求頭User-Agent的情況下得到。比如,服務器返回的檢測腳本用于檢測瀏覽器是否存在某個bug,針對實際的瀏覽器而言,該瀏覽器本身是存在該bug的,但爬蟲程序中偽造的瀏覽器運行該檢測腳本生成對應cookie時,則不會得到正確的cookie,因此可斷定訪問用戶為爬蟲。再如,cookie生成腳本中融合瀏覽器是否具有網頁翻譯的功能,針對實際的瀏覽器而言,該瀏覽器本身是具有網頁翻譯功能的,但客戶端的瀏覽器運行該檢測腳本時,執行網頁翻譯功能失敗,因此也可斷定訪問用戶為爬蟲。
針對以自定義cookie為基礎的爬蟲檢測技術,瀏覽器可以通過執行JS代碼獲取到后端認可的結果,同理,攻擊者也可以通過攔截JS代碼并對其分析,從而達到同樣的目的。因此返回的JS代碼需要具備反攔截以及不易逆向的特點,此時將JavaScript-obfuscator混淆技術結合到基于自定義cookie的檢測技術中,保證代碼安全。此處的JavaScript-obfuscator混淆技術通常包含JS代碼壓縮、混淆與加密技術。
4.JS代碼壓縮、混淆與加密
JS代碼壓縮是去除JS代碼中的不必要的空格、換行等內容,使源碼壓縮為幾行內容,降低代碼可讀性,同時也可以提高網站的加載速度。
JS代碼混淆是一種較為理想、實用的代碼保護方案,通過使用變量混淆、字符串混淆、反格式化、控制流平坦化、無用代碼注入、對象鍵名替換、禁用控制臺輸出、調試保護、域名鎖定等手段,在不影響代碼原有功能的基礎上,使代碼變得難以閱讀和分析,達到最終保護的目的。JS代碼加密是通過某種手段將JS代碼進行加密,轉成人無法閱讀或者解析的代碼或將代碼完全抽象化加密。
常見的JS代碼加密技術有JSfuck、AAEncode、JJEncode、eval加密。JSfuck、AAEncode、JJEncode加密技術利用各自的符號庫對JS代碼進行編碼,eval加密往往也都是以eval(p,a,c,k,e,r)或者是eval(function(p,a,c,k,e,d)作為代碼開頭。以上四種加密方式加密特征明顯,易于解碼,利用瀏覽器的開發者工具均可以完全還原,與此同時eval加密技術壓棧很嚴重,可能出現內存溢出情況,所以只適合核心功能加密。特別的,JJEncode有瀏覽器依賴,代碼不能在某種瀏覽器上運行。另外還有更強大的加密技術,可以直接將JS代碼用C/C++實現,瀏覽器調用其編譯后形成的文件來執行相應的功能,如Emscripten、WebAssembly。
變量混淆是將帶有含義的變量名、方法名、常量名隨機變為無意義的類亂碼字符串,降低代碼可讀性,如轉成單個字符或十六進制字符串。
字符串混淆是將字符串陣列化集中放置、并可進行MD5或Base64加密存儲,使代碼中不出現明文字符串,這樣可以避免使用全局搜索字符串的方式定位到入口點。
JS代碼格式化的原因是由于保存到本地的JS文件被壓縮且不利于觀察,格式化即美化,反格式化即如果對JS代碼進行格式化,則無法執行,導致瀏覽器假死。控制流平坦化通過打亂函數原有代碼執行流程及函數調用關系,在邏輯處理塊前統一加上驅動邏輯塊,使代碼邏變得混亂無序,簡單來講就是將代碼塊之間的關系打斷,由一個分發器來控制代碼塊的跳轉,如圖3和圖4所示。
圖3 混淆前的代碼流程圖
圖4 混淆后的代碼流程圖
無用代碼注入是隨機在代碼中插入不會被執行到的無用代碼,進一步使代碼看起來更加混亂。禁用控制臺輸出是通過置空控制臺方法(console.log, console.debug, console.info, console.error, console.exception, console.trace, console.warn)的方式實現的。調試保護是基于調試器特性,對當前運行環境進行檢驗,加入一些強制調試debugger語句,使其在調試模式下難以順利執行JS代碼。域名鎖定是使JS代碼只能在指定域名下執行。
5.JavaScript-obfuscator混淆
在前端開發中,作為JS混淆主流的實現,JavaScript-obfuscator庫和terser庫提供了一些代碼混淆功能,也都有對應的Webpack 和Rollup打包工具的插件,從而方便實現頁面的混淆,最終輸出壓縮和混淆后的JS代碼,使得JS代碼可讀性大大降低,JavaScript-obfuscator的混淆選項如圖5所示。
圖5 JavaScript-obfuscator混淆的混淆選項
JavaScript-obfuscator混淆有眾多的參數,但JavaScript-obfuscator混淆后代碼的抽象語法樹依次包含以下結構:大數組-->數組移位-->解密函數-->控制流平坦化后的核心代碼-->無限debugger自執行函數+死代碼注入。整體ob的強度幾乎完全取決于這四段的代碼強度,其中包含加密前的邏輯。
常用混淆工具有YUI Compressor、Google Closure Compiler、UglifyJS、JScrambler以及JavaScript-obfuscator系工具(obfuscator.io、soJSon v5.0 v6.0、JShaman)。
6.總結
爬蟲貢獻了互聯網50%的流量,它對于互聯網的繁榮功不可沒,但該技術同時也因“用途”而充滿爭議,爬蟲與反爬蟲一直處于互相博弈的狀態。此消彼長,在這一過程中反爬蟲漸漸發展為具備智能交互、數據采集、實時計算、模型分析以及決策判斷等能力綜合性安全系統,而不再是一個簡易工具。相信隨著監管越來越嚴格,爬蟲技術的使用邊界也將更加明晰,互聯網環境也將越來越清澈。