馬超勇,李秋賢,周全興
(凱里學院 大數據工程學院,貴州 凱里 556011)
搜索引擎對網絡資源的收集與整理,帶來了網絡資源的高度共享與高速傳遞,同時使得網絡爬蟲技術日益普及。據搜索引擎巨頭Google 透露,2012年,Google 的網頁爬蟲Googlebot 每天都會經過大約200 億個網頁,并且追蹤著約300 億個獨立的URL 鏈接。此外,Google 每個月的搜索請求接近1 000 億次,而確保這一切如常進行的強大后盾就是網絡爬蟲技術。
對一些網站來說,爬蟲所帶來的流量遠遠超過真實用戶的訪問流量,甚至爬蟲流量要高出真實流量一個數量級。大型網站還可以應對,但這對許多中小型網站來說往往是毀滅性的打擊。網絡爬蟲的危害不僅僅局限于流量攻擊和數據資源泄漏,同時還有用戶的惡意行為攻擊(重放攻擊、特定行為攻擊),例如通過爬蟲實現定時打卡簽到、搶購秒殺商品、搶購優惠券、自動投票等從中薅取羊毛,獲得利益,極大地破壞了公平性并有損其他用戶的正常體驗。通過引入智能攔截系統可避免后端數據被有不良意圖的爬蟲抓取,保護網站內容和用戶隱私的安全。因此,如何檢測和攔截爬蟲,增加非法爬蟲的抓取難度,減少爬蟲帶來的負面影響,已成為許多網站亟待解決的問題。反爬蟲在保障網站正常運行、保護網站數據和用戶隱私安全方面有著重要的意義。
知己知彼方能百戰不殆,若要對爬蟲進行攔截,首先得知曉爬蟲的請求特征,從而依據其特征構造反爬蟲技術。
初級爬蟲請求頭可能還是原生爬蟲程序自帶的,如Python 中的requests 模塊,請求頭默認為python-request/x.xx.x,網站可通過請求頭Headers 中的User-Agent 并結合Referer 進行檢測分析,區別正常用戶與爬蟲程序。
爬蟲一般具有很強的目的性,往往只針對需求向某個或某些接口發起大量請求,而且對接口發起的請求是多線程運行的,同時為了防止被封禁IP,可能會使用動態代理IP 來防止被查處,爬蟲的請求過程如圖1所示。

圖1 單機多線程爬蟲請求過程
下面列舉常用且較為有效的爬蟲防護措施:
(1)設置robots.txt 協議來規范爬蟲行為,該協議并沒有采用技術手段來實現反爬,只是一個申明,往往只對搜索引擎的爬蟲有效,而對有目的性的爬蟲卻束手無策。
(2)在進行重要操作之前設置驗證碼(如圖形驗證碼、滑塊驗證碼、點選驗證碼),但這會在一定程度上降低用戶體驗度。
(3)通過自定義規則實現簽名,從而防止篡改參數,這要求客戶端和服務端都使用相同的特定算法對請求參數進行加解密,一般通過綁定時間戳(timestamp)、隨機字符串(nonce)計算得到簽名(signature)。
(4)因為參數防篡改操作有些是在客戶端完成的,爬蟲攻擊者仍然可以通過解析JavaScript 獲得其中的加密算法,所以通常會加上JavaScript 混淆。
(5)全局數據提交加密,即對提交的數據(如{uname:123,pwd:456})進行加密,123 和456 這兩個要提交的數值需要先進行加密(對稱加密算法或非對稱加密算法),再轉換16 進制提交,返回的JSON 數據使用相同的算法進行解密。
(6)如果某個IP 在一個時間點大量請求服務器資源,服務器后臺可以阻斷其后續訪問操作,即限制IP 單位時間內的訪問次數。
(7)可以將API 接口與靜態資源進行綁定,但凡不是事先請求綁定的靜態資源,都不會向客戶端暴露API。
縱使網站有圖片驗證碼,爬蟲編寫者也可以使用OCR識別技術進行識別驗證;縱使有滑塊識別,也有圖像處理、灰度差校驗,從而計算缺口距離出現偏移量;縱使有漢字點選、語序點選,也有CRNN-CTC 漢字識別、YOLO3 漢字定位以及JIEBA 分詞;縱使是Google 的ReCAPTCHA2 和Hcaptcha,都可使用Tensor Flow機器學習框架進行圖像分類、模型訓練,以解決驗證碼問題。
利用Fiddler 抓取Web 網站和手機應用數據包(但在已做風控的應用中,一般無法直接抓取或篡改其數據包,從而無法實現一些操作,原因是應用程序會檢測用戶是否開啟了Wi-Fi 代理(檢測到開啟Wi-Fi 后會立即斷開網絡/拒絕訪問)或在服務端對數據進行簽名校驗,以此來檢測數據是否被篡改。
Fiddler 抓包會有局限性,諸如對WebSocket 的數據抓取支持不太友好,且應用程序檢測到Wi-Fi 代理后會自動斷開網絡,導致無法抓包。利用HttpCanary 抓包可解決以上問題,相較于Fiddler,該抓包工具無須使用Wi-Fi 代理即可對本地應用程序進行抓包,同時還可以抓取小程序應用的數據包。
未做風控的APP 應用比已做風控的APP 應用更容易遭受爬蟲的攻擊,因為未做風控的APP 應用可直接通過抓包工具獲取API 接口,而做了風控的APP 應用可能已進行安全加固,但爬蟲攻擊者仍可以解固脫殼,逆向反編譯得到加密算法,用代碼實現一套相同的算法再通過爬蟲向服務器發出請求。
除使用上述抓包工具分析HTTP 請求以外,還可以使用Wireshark 對人臉識別/指紋識別考勤機與服務器交互數據進行抓包嗅探,攻擊者識別其數據傳輸協議是TCP 協議或是HTTP 協議后很容易受到重放攻擊,但凡和服務器處于一個VLAN,都可以實現不在場簽到,這源于服務器是將人臉或指紋數據下發到考勤機,由考勤機去比對數據是否與本地存儲的數據相吻合,如果吻合則攜帶SN 機器序列號、用戶ID、時間戳等信息請求服務器。
Web 服務或應用軟件沒有做風控將是一件非常危險的事情,等同于數據在網絡中透明傳輸,用戶可以任意截獲并修改數據,實現自動化操作,而實際的軟件開發更應該遵循零信任原則,即對傳輸中的全局數據進行加密(可采用自定義密鑰+RC4/AES/DES/RSA 等算法對請求參數以及響應參數進行加密,再轉換為Base64 或16 進制傳輸)。
目的性爬蟲接觸黑灰產業較多,一般網站或APP 應用都有手機號碼注冊和登錄機制,目的性爬蟲為達到某些特定目的而通過接碼平臺注冊大量虛假賬號,極大地影響了公司決策與正常業務的開展。下面給出相應的解決方案:
(1)屏蔽虛擬號段注冊登錄(虛擬號段即運營商虛擬號,并非正常用戶使用的手機卡)。
(2)雙向驗證,即注冊時需用戶發送特定文本至指定的服務號碼,該服務號碼會自動回復,給用戶下發驗證碼,用戶依據收到的驗證碼即可成功注冊,如圖2所示。

圖2 國內12306 使用該方案示例
(3)注冊后還需實名認證(采用行業內先進的阿里云身份認證)方可進行敏感或相關活動操作。
系統旨在對包括但不限于對數據庫表增刪改查的API 接口做防護,其目的是防止API 接口被盜用/盜刷,減少服務器負載以及預防非法操作,使用ProxyServlet 作反向代理。用兩個過濾器(Filter),一個用于傳輸過程中的加解密,另一個用于對請求進行解析校驗以判斷其是否合法,系統架構設計圖如圖3所示。

圖3 系統架構設計圖
3.2.1 數據傳輸加解密模塊
自定義的響應加密算法用于業務系統的響應加密,業務系統無須設置加解密,減少重構,只有前端需要解密數據,且前端可以通過后臺設置指定的加密方式加密請求參數,攔截系統接收到請求參數,自動解密后將其轉發給業務系統。
目前,攔截系統引入的加密算法有摘要加密(MD5、SHA)、對稱加密(AES、DES)、非對稱加密(RSA)。
通過后臺數據庫定義的加密算法、解密算法,利用Java反射創建對象。對請求的參數進行解密(若解密失敗直接由攔截系統返回),獲取解密參數后,對參數進行SQL注入替換、XSS 注入替換,再將經處理的參數轉發給業務服務器。在數據得到業務服務器的響應后,對數據進行指定算法加密,并將加密后的密文返回。
3.2.2 IP 黑白名單模塊
依據后臺自定義的IP 黑白名單配置,判斷當前IP 是否在黑名單之中(或國外IP 禁訪是否開啟),如果當前IP 在黑名單之中,則直接攔截并觸發后臺設定的規則。獲取客戶端IP 方式會先解析請求頭Header 得到x-forwarded-for、Proxy-Client-IP、WL-Proxy-Client-IP、HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR,如果均不存在則直接獲取客戶端IP 地址。
3.2.3 維度攔截信息模塊
不同維度攔截狀態描述,如單位時間內超過設定的請求次數、對請求進行UserAgent、Referer、Host 的校驗,達到預期設定的錯誤后直接返回并觸發后臺設定的規則。
3.2.4 請求時序攔截模塊
請求時序攔截模塊包含兩部分功能,第一部分功能是后臺設置父子接口,即須在請求A 接口(父接口)之前先請求B 接口(子接口),即便是這兩個接口沒有任何關聯。由后臺服務器校驗當前請求是否為父接口,如果是則進行時序校驗,僅當校驗通過后交由業務服務器處理;第二部分功能是靜態資源關聯,即某一個接口或某一些接口關聯著一個靜態資源,第一種模式是在請求接口的時候會先判斷靜態資源是否被該客戶端訪問(可能存在網絡延時分區問題),如果靜態資源沒有被訪問則直接進行攔截處理,這樣就忽略了網絡延時分區問題。第二種模式是第一種模式的增強改進,請求接口能正常返回,但是如果在預設的時間內沒有請求有關靜態資源,則會回滾數據或將該用戶標記為Robot,功能模塊所在系統位置如圖4所示。

圖4 功能模塊所在系統位置圖
攔截系統的開發采用的是IDEA 開發工具,開發語言為JAVA,前端框架采用HTML、JQuery、LayUI,后端框架采用SpringBoot、MyBatis-Plus,數據庫使用Redis、MySQL。
平臺數據使用MySQL 進行存儲, 通過Redis 來緩存攔截配置,其中Redis 緩存采用的序列化方式為JdkSerializationRedisSerializer,所涉的數據類型有String、List、Hash,緩存的具體內容為:
(1)存儲IP 黑白名單信息。
(2)存儲當前選擇的加解密算法對象和攔截信息對象。
(3)存儲請求時序信息。
(4)存儲不同維度信息。
(5)存儲攔截IP 信息。
系統初始化過程是先通過查詢MySQL 數據庫獲取傳輸加解密規則、攔截維度選擇、IP 黑白名單、維度信息初始化,并將其轉至Redis 存儲,從而減少與數據庫的直接交互。
平臺存在兩個系統,分別是攔截系統和管理系統,其MySQL 數據庫都是共用的。平臺中部分數據庫表如表1、表2、表3、表4、表5所示。

表1 算法擇選信息表

表2 攔截觸發條件信息表

表3 攔截API 接口信息表

表4 攔截規則擇選信息表

表5 管理系統用戶信息表
因攔截系統無界面,由管理系統進行控制管理,故下面僅展示管理系統控制臺及其部分功能頁面,系統控制臺及系統功能頁面如圖5、圖6和圖7所示。

圖5 管理系統控制臺及系統監控圖

圖6 管理系統攔截規則配置圖

圖7 管理系統數據傳輸加解密配置圖
攔截系統屬于反向代理服務,避免了與業務系統的代碼耦合。另外該攔截智能可控、靈活多樣,依據自定義的維度設定即可實現攔截,并在單位時間內限制最大請求,同時結合字段加密,提供了接口服務的安全保障,維護了資源數據安全,規避了接口攻擊。
然而,系統仍存在缺陷,如配置需要手動配置,由于沒有引入機器學習故而不能自動對參數進行優化,有待完善的內容包括:爬蟲識別算法進一步優化、引入更為完善的爬蟲識別技術(如設計陷阱捕獲)、引入其他機器學習識別爬蟲等,增強對爬蟲的識別能力。真正實現完整的防護、細膩的檢測、智能的攔截。