馬超勇,李秋賢,周全興
(凱里學(xué)院 大數(shù)據(jù)工程學(xué)院,貴州 凱里 556011)
搜索引擎對(duì)網(wǎng)絡(luò)資源的收集與整理,帶來了網(wǎng)絡(luò)資源的高度共享與高速傳遞,同時(shí)使得網(wǎng)絡(luò)爬蟲技術(shù)日益普及。據(jù)搜索引擎巨頭Google 透露,2012年,Google 的網(wǎng)頁爬蟲Googlebot 每天都會(huì)經(jīng)過大約200 億個(gè)網(wǎng)頁,并且追蹤著約300 億個(gè)獨(dú)立的URL 鏈接。此外,Google 每個(gè)月的搜索請(qǐng)求接近1 000 億次,而確保這一切如常進(jìn)行的強(qiáng)大后盾就是網(wǎng)絡(luò)爬蟲技術(shù)。
對(duì)一些網(wǎng)站來說,爬蟲所帶來的流量遠(yuǎn)遠(yuǎn)超過真實(shí)用戶的訪問流量,甚至爬蟲流量要高出真實(shí)流量一個(gè)數(shù)量級(jí)。大型網(wǎng)站還可以應(yīng)對(duì),但這對(duì)許多中小型網(wǎng)站來說往往是毀滅性的打擊。網(wǎng)絡(luò)爬蟲的危害不僅僅局限于流量攻擊和數(shù)據(jù)資源泄漏,同時(shí)還有用戶的惡意行為攻擊(重放攻擊、特定行為攻擊),例如通過爬蟲實(shí)現(xiàn)定時(shí)打卡簽到、搶購秒殺商品、搶購優(yōu)惠券、自動(dòng)投票等從中薅取羊毛,獲得利益,極大地破壞了公平性并有損其他用戶的正常體驗(yàn)。通過引入智能攔截系統(tǒng)可避免后端數(shù)據(jù)被有不良意圖的爬蟲抓取,保護(hù)網(wǎng)站內(nèi)容和用戶隱私的安全。因此,如何檢測(cè)和攔截爬蟲,增加非法爬蟲的抓取難度,減少爬蟲帶來的負(fù)面影響,已成為許多網(wǎng)站亟待解決的問題。反爬蟲在保障網(wǎng)站正常運(yùn)行、保護(hù)網(wǎng)站數(shù)據(jù)和用戶隱私安全方面有著重要的意義。
知己知彼方能百戰(zhàn)不殆,若要對(duì)爬蟲進(jìn)行攔截,首先得知曉爬蟲的請(qǐng)求特征,從而依據(jù)其特征構(gòu)造反爬蟲技術(shù)。
初級(jí)爬蟲請(qǐng)求頭可能還是原生爬蟲程序自帶的,如Python 中的requests 模塊,請(qǐng)求頭默認(rèn)為python-request/x.xx.x,網(wǎng)站可通過請(qǐng)求頭Headers 中的User-Agent 并結(jié)合Referer 進(jìn)行檢測(cè)分析,區(qū)別正常用戶與爬蟲程序。
爬蟲一般具有很強(qiáng)的目的性,往往只針對(duì)需求向某個(gè)或某些接口發(fā)起大量請(qǐng)求,而且對(duì)接口發(fā)起的請(qǐng)求是多線程運(yùn)行的,同時(shí)為了防止被封禁IP,可能會(huì)使用動(dòng)態(tài)代理IP 來防止被查處,爬蟲的請(qǐng)求過程如圖1所示。
圖1 單機(jī)多線程爬蟲請(qǐng)求過程
下面列舉常用且較為有效的爬蟲防護(hù)措施:
(1)設(shè)置robots.txt 協(xié)議來規(guī)范爬蟲行為,該協(xié)議并沒有采用技術(shù)手段來實(shí)現(xiàn)反爬,只是一個(gè)申明,往往只對(duì)搜索引擎的爬蟲有效,而對(duì)有目的性的爬蟲卻束手無策。
(2)在進(jìn)行重要操作之前設(shè)置驗(yàn)證碼(如圖形驗(yàn)證碼、滑塊驗(yàn)證碼、點(diǎn)選驗(yàn)證碼),但這會(huì)在一定程度上降低用戶體驗(yàn)度。
(3)通過自定義規(guī)則實(shí)現(xiàn)簽名,從而防止篡改參數(shù),這要求客戶端和服務(wù)端都使用相同的特定算法對(duì)請(qǐng)求參數(shù)進(jìn)行加解密,一般通過綁定時(shí)間戳(timestamp)、隨機(jī)字符串(nonce)計(jì)算得到簽名(signature)。
(4)因?yàn)閰?shù)防篡改操作有些是在客戶端完成的,爬蟲攻擊者仍然可以通過解析JavaScript 獲得其中的加密算法,所以通常會(huì)加上JavaScript 混淆。
(5)全局?jǐn)?shù)據(jù)提交加密,即對(duì)提交的數(shù)據(jù)(如{uname:123,pwd:456})進(jìn)行加密,123 和456 這兩個(gè)要提交的數(shù)值需要先進(jìn)行加密(對(duì)稱加密算法或非對(duì)稱加密算法),再轉(zhuǎn)換16 進(jìn)制提交,返回的JSON 數(shù)據(jù)使用相同的算法進(jìn)行解密。
(6)如果某個(gè)IP 在一個(gè)時(shí)間點(diǎn)大量請(qǐng)求服務(wù)器資源,服務(wù)器后臺(tái)可以阻斷其后續(xù)訪問操作,即限制IP 單位時(shí)間內(nèi)的訪問次數(shù)。
(7)可以將API 接口與靜態(tài)資源進(jìn)行綁定,但凡不是事先請(qǐng)求綁定的靜態(tài)資源,都不會(huì)向客戶端暴露API。
縱使網(wǎng)站有圖片驗(yàn)證碼,爬蟲編寫者也可以使用OCR識(shí)別技術(shù)進(jìn)行識(shí)別驗(yàn)證;縱使有滑塊識(shí)別,也有圖像處理、灰度差校驗(yàn),從而計(jì)算缺口距離出現(xiàn)偏移量;縱使有漢字點(diǎn)選、語序點(diǎn)選,也有CRNN-CTC 漢字識(shí)別、YOLO3 漢字定位以及JIEBA 分詞;縱使是Google 的ReCAPTCHA2 和Hcaptcha,都可使用Tensor Flow機(jī)器學(xué)習(xí)框架進(jìn)行圖像分類、模型訓(xùn)練,以解決驗(yàn)證碼問題。
利用Fiddler 抓取Web 網(wǎng)站和手機(jī)應(yīng)用數(shù)據(jù)包(但在已做風(fēng)控的應(yīng)用中,一般無法直接抓取或篡改其數(shù)據(jù)包,從而無法實(shí)現(xiàn)一些操作,原因是應(yīng)用程序會(huì)檢測(cè)用戶是否開啟了Wi-Fi 代理(檢測(cè)到開啟Wi-Fi 后會(huì)立即斷開網(wǎng)絡(luò)/拒絕訪問)或在服務(wù)端對(duì)數(shù)據(jù)進(jìn)行簽名校驗(yàn),以此來檢測(cè)數(shù)據(jù)是否被篡改。
Fiddler 抓包會(huì)有局限性,諸如對(duì)WebSocket 的數(shù)據(jù)抓取支持不太友好,且應(yīng)用程序檢測(cè)到Wi-Fi 代理后會(huì)自動(dòng)斷開網(wǎng)絡(luò),導(dǎo)致無法抓包。利用HttpCanary 抓包可解決以上問題,相較于Fiddler,該抓包工具無須使用Wi-Fi 代理即可對(duì)本地應(yīng)用程序進(jìn)行抓包,同時(shí)還可以抓取小程序應(yīng)用的數(shù)據(jù)包。
未做風(fēng)控的APP 應(yīng)用比已做風(fēng)控的APP 應(yīng)用更容易遭受爬蟲的攻擊,因?yàn)槲醋鲲L(fēng)控的APP 應(yīng)用可直接通過抓包工具獲取API 接口,而做了風(fēng)控的APP 應(yīng)用可能已進(jìn)行安全加固,但爬蟲攻擊者仍可以解固脫殼,逆向反編譯得到加密算法,用代碼實(shí)現(xiàn)一套相同的算法再通過爬蟲向服務(wù)器發(fā)出請(qǐng)求。
除使用上述抓包工具分析HTTP 請(qǐng)求以外,還可以使用Wireshark 對(duì)人臉識(shí)別/指紋識(shí)別考勤機(jī)與服務(wù)器交互數(shù)據(jù)進(jìn)行抓包嗅探,攻擊者識(shí)別其數(shù)據(jù)傳輸協(xié)議是TCP 協(xié)議或是HTTP 協(xié)議后很容易受到重放攻擊,但凡和服務(wù)器處于一個(gè)VLAN,都可以實(shí)現(xiàn)不在場簽到,這源于服務(wù)器是將人臉或指紋數(shù)據(jù)下發(fā)到考勤機(jī),由考勤機(jī)去比對(duì)數(shù)據(jù)是否與本地存儲(chǔ)的數(shù)據(jù)相吻合,如果吻合則攜帶SN 機(jī)器序列號(hào)、用戶ID、時(shí)間戳等信息請(qǐng)求服務(wù)器。
Web 服務(wù)或應(yīng)用軟件沒有做風(fēng)控將是一件非常危險(xiǎn)的事情,等同于數(shù)據(jù)在網(wǎng)絡(luò)中透明傳輸,用戶可以任意截獲并修改數(shù)據(jù),實(shí)現(xiàn)自動(dòng)化操作,而實(shí)際的軟件開發(fā)更應(yīng)該遵循零信任原則,即對(duì)傳輸中的全局?jǐn)?shù)據(jù)進(jìn)行加密(可采用自定義密鑰+RC4/AES/DES/RSA 等算法對(duì)請(qǐng)求參數(shù)以及響應(yīng)參數(shù)進(jìn)行加密,再轉(zhuǎn)換為Base64 或16 進(jìn)制傳輸)。
目的性爬蟲接觸黑灰產(chǎn)業(yè)較多,一般網(wǎng)站或APP 應(yīng)用都有手機(jī)號(hào)碼注冊(cè)和登錄機(jī)制,目的性爬蟲為達(dá)到某些特定目的而通過接碼平臺(tái)注冊(cè)大量虛假賬號(hào),極大地影響了公司決策與正常業(yè)務(wù)的開展。下面給出相應(yīng)的解決方案:
(1)屏蔽虛擬號(hào)段注冊(cè)登錄(虛擬號(hào)段即運(yùn)營商虛擬號(hào),并非正常用戶使用的手機(jī)卡)。
(2)雙向驗(yàn)證,即注冊(cè)時(shí)需用戶發(fā)送特定文本至指定的服務(wù)號(hào)碼,該服務(wù)號(hào)碼會(huì)自動(dòng)回復(fù),給用戶下發(fā)驗(yàn)證碼,用戶依據(jù)收到的驗(yàn)證碼即可成功注冊(cè),如圖2所示。
圖2 國內(nèi)12306 使用該方案示例
(3)注冊(cè)后還需實(shí)名認(rèn)證(采用行業(yè)內(nèi)先進(jìn)的阿里云身份認(rèn)證)方可進(jìn)行敏感或相關(guān)活動(dòng)操作。
系統(tǒng)旨在對(duì)包括但不限于對(duì)數(shù)據(jù)庫表增刪改查的API 接口做防護(hù),其目的是防止API 接口被盜用/盜刷,減少服務(wù)器負(fù)載以及預(yù)防非法操作,使用ProxyServlet 作反向代理。用兩個(gè)過濾器(Filter),一個(gè)用于傳輸過程中的加解密,另一個(gè)用于對(duì)請(qǐng)求進(jìn)行解析校驗(yàn)以判斷其是否合法,系統(tǒng)架構(gòu)設(shè)計(jì)圖如圖3所示。
圖3 系統(tǒng)架構(gòu)設(shè)計(jì)圖
3.2.1 數(shù)據(jù)傳輸加解密模塊
自定義的響應(yīng)加密算法用于業(yè)務(wù)系統(tǒng)的響應(yīng)加密,業(yè)務(wù)系統(tǒng)無須設(shè)置加解密,減少重構(gòu),只有前端需要解密數(shù)據(jù),且前端可以通過后臺(tái)設(shè)置指定的加密方式加密請(qǐng)求參數(shù),攔截系統(tǒng)接收到請(qǐng)求參數(shù),自動(dòng)解密后將其轉(zhuǎn)發(fā)給業(yè)務(wù)系統(tǒng)。
目前,攔截系統(tǒng)引入的加密算法有摘要加密(MD5、SHA)、對(duì)稱加密(AES、DES)、非對(duì)稱加密(RSA)。
通過后臺(tái)數(shù)據(jù)庫定義的加密算法、解密算法,利用Java反射創(chuàng)建對(duì)象。對(duì)請(qǐng)求的參數(shù)進(jìn)行解密(若解密失敗直接由攔截系統(tǒng)返回),獲取解密參數(shù)后,對(duì)參數(shù)進(jìn)行SQL注入替換、XSS 注入替換,再將經(jīng)處理的參數(shù)轉(zhuǎn)發(fā)給業(yè)務(wù)服務(wù)器。在數(shù)據(jù)得到業(yè)務(wù)服務(wù)器的響應(yīng)后,對(duì)數(shù)據(jù)進(jìn)行指定算法加密,并將加密后的密文返回。
3.2.2 IP 黑白名單模塊
依據(jù)后臺(tái)自定義的IP 黑白名單配置,判斷當(dāng)前IP 是否在黑名單之中(或國外IP 禁訪是否開啟),如果當(dāng)前IP 在黑名單之中,則直接攔截并觸發(fā)后臺(tái)設(shè)定的規(guī)則。獲取客戶端IP 方式會(huì)先解析請(qǐng)求頭Header 得到x-forwarded-for、Proxy-Client-IP、WL-Proxy-Client-IP、HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR,如果均不存在則直接獲取客戶端IP 地址。
3.2.3 維度攔截信息模塊
不同維度攔截狀態(tài)描述,如單位時(shí)間內(nèi)超過設(shè)定的請(qǐng)求次數(shù)、對(duì)請(qǐng)求進(jìn)行UserAgent、Referer、Host 的校驗(yàn),達(dá)到預(yù)期設(shè)定的錯(cuò)誤后直接返回并觸發(fā)后臺(tái)設(shè)定的規(guī)則。
3.2.4 請(qǐng)求時(shí)序攔截模塊
請(qǐng)求時(shí)序攔截模塊包含兩部分功能,第一部分功能是后臺(tái)設(shè)置父子接口,即須在請(qǐng)求A 接口(父接口)之前先請(qǐng)求B 接口(子接口),即便是這兩個(gè)接口沒有任何關(guān)聯(lián)。由后臺(tái)服務(wù)器校驗(yàn)當(dāng)前請(qǐng)求是否為父接口,如果是則進(jìn)行時(shí)序校驗(yàn),僅當(dāng)校驗(yàn)通過后交由業(yè)務(wù)服務(wù)器處理;第二部分功能是靜態(tài)資源關(guān)聯(lián),即某一個(gè)接口或某一些接口關(guān)聯(lián)著一個(gè)靜態(tài)資源,第一種模式是在請(qǐng)求接口的時(shí)候會(huì)先判斷靜態(tài)資源是否被該客戶端訪問(可能存在網(wǎng)絡(luò)延時(shí)分區(qū)問題),如果靜態(tài)資源沒有被訪問則直接進(jìn)行攔截處理,這樣就忽略了網(wǎng)絡(luò)延時(shí)分區(qū)問題。第二種模式是第一種模式的增強(qiáng)改進(jìn),請(qǐng)求接口能正常返回,但是如果在預(yù)設(shè)的時(shí)間內(nèi)沒有請(qǐng)求有關(guān)靜態(tài)資源,則會(huì)回滾數(shù)據(jù)或?qū)⒃撚脩魳?biāo)記為Robot,功能模塊所在系統(tǒng)位置如圖4所示。
圖4 功能模塊所在系統(tǒng)位置圖
攔截系統(tǒng)的開發(fā)采用的是IDEA 開發(fā)工具,開發(fā)語言為JAVA,前端框架采用HTML、JQuery、LayUI,后端框架采用SpringBoot、MyBatis-Plus,數(shù)據(jù)庫使用Redis、MySQL。
平臺(tái)數(shù)據(jù)使用MySQL 進(jìn)行存儲(chǔ), 通過Redis 來緩存攔截配置,其中Redis 緩存采用的序列化方式為JdkSerializationRedisSerializer,所涉的數(shù)據(jù)類型有String、List、Hash,緩存的具體內(nèi)容為:
(1)存儲(chǔ)IP 黑白名單信息。
(2)存儲(chǔ)當(dāng)前選擇的加解密算法對(duì)象和攔截信息對(duì)象。
(3)存儲(chǔ)請(qǐng)求時(shí)序信息。
(4)存儲(chǔ)不同維度信息。
(5)存儲(chǔ)攔截IP 信息。
系統(tǒng)初始化過程是先通過查詢MySQL 數(shù)據(jù)庫獲取傳輸加解密規(guī)則、攔截維度選擇、IP 黑白名單、維度信息初始化,并將其轉(zhuǎn)至Redis 存儲(chǔ),從而減少與數(shù)據(jù)庫的直接交互。
平臺(tái)存在兩個(gè)系統(tǒng),分別是攔截系統(tǒng)和管理系統(tǒng),其MySQL 數(shù)據(jù)庫都是共用的。平臺(tái)中部分?jǐn)?shù)據(jù)庫表如表1、表2、表3、表4、表5所示。
表1 算法擇選信息表
表2 攔截觸發(fā)條件信息表
表3 攔截API 接口信息表
表4 攔截規(guī)則擇選信息表
表5 管理系統(tǒng)用戶信息表
因攔截系統(tǒng)無界面,由管理系統(tǒng)進(jìn)行控制管理,故下面僅展示管理系統(tǒng)控制臺(tái)及其部分功能頁面,系統(tǒng)控制臺(tái)及系統(tǒng)功能頁面如圖5、圖6和圖7所示。
圖5 管理系統(tǒng)控制臺(tái)及系統(tǒng)監(jiān)控圖
圖6 管理系統(tǒng)攔截規(guī)則配置圖
圖7 管理系統(tǒng)數(shù)據(jù)傳輸加解密配置圖
攔截系統(tǒng)屬于反向代理服務(wù),避免了與業(yè)務(wù)系統(tǒng)的代碼耦合。另外該攔截智能可控、靈活多樣,依據(jù)自定義的維度設(shè)定即可實(shí)現(xiàn)攔截,并在單位時(shí)間內(nèi)限制最大請(qǐng)求,同時(shí)結(jié)合字段加密,提供了接口服務(wù)的安全保障,維護(hù)了資源數(shù)據(jù)安全,規(guī)避了接口攻擊。
然而,系統(tǒng)仍存在缺陷,如配置需要手動(dòng)配置,由于沒有引入機(jī)器學(xué)習(xí)故而不能自動(dòng)對(duì)參數(shù)進(jìn)行優(yōu)化,有待完善的內(nèi)容包括:爬蟲識(shí)別算法進(jìn)一步優(yōu)化、引入更為完善的爬蟲識(shí)別技術(shù)(如設(shè)計(jì)陷阱捕獲)、引入其他機(jī)器學(xué)習(xí)識(shí)別爬蟲等,增強(qiáng)對(duì)爬蟲的識(shí)別能力。真正實(shí)現(xiàn)完整的防護(hù)、細(xì)膩的檢測(cè)、智能的攔截。