自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

爬蟲與反爬蟲技術(shù)

開發(fā) 前端
互聯(lián)網(wǎng)的快速發(fā)展離不開爬蟲的貢獻(xiàn),百度爬蟲、搜狗爬蟲、360爬蟲、UC爬蟲...各式各樣的爬蟲背后同時(shí)也隱藏著一些阻礙互聯(lián)網(wǎng)發(fā)展的爬蟲...什么是爬蟲?爬蟲是如何爬取到數(shù)據(jù)的?不想讓爬蟲爬取我的網(wǎng)站,該怎么辦?本文將對這些問題做一個(gè)深入淺出的介紹。

1.爬蟲與反爬蟲的概念

互聯(lián)網(wǎng)站點(diǎn)的流量一部分由人類正常訪問行為產(chǎn)生,而高達(dá)30%-60%的流量則是由網(wǎng)絡(luò)爬蟲產(chǎn)生的,其中一部分包含友好網(wǎng)絡(luò)爬蟲,如搜索引擎的爬蟲、廣告程序、第三方合作伙伴程序、Robots協(xié)議友好程序等;而并非所有的網(wǎng)絡(luò)爬蟲都是友好的,爬蟲流量中仍有約20%~30%的流量來自惡意網(wǎng)絡(luò)爬蟲。從網(wǎng)站業(yè)務(wù)安全的角度,例如文學(xué)博客、招聘網(wǎng)站、論壇網(wǎng)站、電商等網(wǎng)站均以文本為商品作為盈利點(diǎn),而惡意爬蟲則可以通過爬取核心文本從中謀取利益;競品公司還可以通過利用惡意爬蟲爬取商品價(jià)格和詳情或者注冊用戶信息后進(jìn)行同類產(chǎn)品線和價(jià)格的研究,通過推出過低價(jià)格等手段來破壞市場秩序;對于帶寬有限的中小型網(wǎng)站,高頻、大規(guī)模的惡意爬蟲可能會降低網(wǎng)頁加載速度,影響真實(shí)用戶的訪問體驗(yàn),增加網(wǎng)站帶寬負(fù)擔(dān)。

由于惡意爬蟲帶來的不利影響,因此出現(xiàn)了爬蟲防御技術(shù)-即反爬蟲技術(shù),反爬蟲技術(shù)可分為被動防御機(jī)制與主動防御機(jī)制。

? 被動防御機(jī)制:主要是根據(jù)檢測結(jié)果展開的,如利用HTTP請求頭User-Agent來判斷、攔截爬蟲請求,或?qū)υL問頻率過高的IP地址進(jìn)行封禁。被動防御存在部分缺陷:被動防御檢測流程和機(jī)制單一,無法應(yīng)對復(fù)雜多變的惡意爬蟲,檢測誤判率高,容易造成誤封、漏封。

? 主動防御機(jī)制:是主流的爬蟲防御發(fā)展方向,通過對網(wǎng)頁底層代碼的持續(xù)動態(tài)變換,增加服務(wù)器行為的“不可預(yù)測性”,大幅提升攻擊難度,從而實(shí)現(xiàn)了從客戶端到服務(wù)器端的全方位“主動防護(hù)”。

2.網(wǎng)絡(luò)爬蟲技術(shù)基本工作流程和基礎(chǔ)架構(gòu)

與正常人類訪問者使用瀏覽器訪問網(wǎng)頁的工作原理相同,網(wǎng)絡(luò)爬蟲也是根據(jù)HTTP協(xié)議來獲取網(wǎng)頁信息的,其流程主要包括如下步驟:

1)對待抓取的URL進(jìn)行域名解析;

2)根據(jù)HTTP協(xié)議,發(fā)送HTTP請求來獲取網(wǎng)頁內(nèi)容。

網(wǎng)絡(luò)爬蟲的基礎(chǔ)架構(gòu)如圖1所示。具體而言,網(wǎng)絡(luò)爬蟲首先通過種子URL延伸得到待抓取URL隊(duì)列,接著網(wǎng)絡(luò)爬蟲從待抓取URL列表中逐個(gè)進(jìn)行讀取,讀取URL的過程中,會將URL進(jìn)行DNS解析,得到網(wǎng)站服務(wù)器的IP地址以及相對路徑,接著再把這個(gè)地址交給網(wǎng)頁下載器(負(fù)責(zé)下載網(wǎng)頁內(nèi)容的一個(gè)模塊),對于下載到本地的網(wǎng)頁,即網(wǎng)頁的源代碼,一方面要將這個(gè)網(wǎng)頁存儲到網(wǎng)頁庫中,另一方面要從下載的網(wǎng)頁中再次提取URL地址,新提取出來的URL地址會先在已抓取的URL列表中進(jìn)行比對,檢查該網(wǎng)頁是否已被抓取,如果網(wǎng)頁沒有被抓取過,就將新的URL地址放入到待抓取的URL列表的末尾,等待被抓取,直至待抓取隊(duì)列為空的時(shí)候,網(wǎng)絡(luò)爬蟲就算完成了抓取的全過程,最后對網(wǎng)頁庫中已下載的網(wǎng)頁進(jìn)行分析與索引后得到收錄結(jié)果。其中所謂種子URL即為最開始選定的URL地址,網(wǎng)站首頁、頻道頁等豐富性內(nèi)容較多的頁面往往會被作為種子URL。

圖片

圖1 網(wǎng)絡(luò)爬蟲的基礎(chǔ)架構(gòu)

3.基于自定義cookie的爬蟲檢測策略

目前的爬蟲檢測技術(shù)主要分為以下四類:一是基于日志分析的檢測技術(shù),二是基于訪問模式的檢測技術(shù),三是基于訪問行為的檢測技術(shù),四是基于圖靈測試的檢測技術(shù)。

  • 基于日志分析的檢測技術(shù)是通過對比用戶和爬蟲名單庫的爬蟲的User-Agent關(guān)鍵詞、IP地址等信息來檢測爬蟲。
  • 基于訪問模式的檢測技術(shù)通過尋找人類用戶與爬蟲的不同流量特征,如查詢數(shù)量、時(shí)間間隔模式、搜索操作頻率等來檢測爬蟲。
  • 基于訪問行為的檢測技術(shù)大多使用機(jī)器學(xué)習(xí)模型如神經(jīng)網(wǎng)絡(luò)、決策樹等通過訪問者的點(diǎn)擊時(shí)間、圖片加載情況以及訪問停留時(shí)長等有利特征來對訪問進(jìn)行分類,從而判斷訪問是否來自爬蟲。
  • 基于圖靈測試的檢測技術(shù)通過讓訪問者回答一些問題來分析其是否為爬蟲,常見的圖靈測試系統(tǒng)有驗(yàn)證碼測試。

除了上述四類方法,蜜罐技術(shù)(隱藏鏈接)也常被使用,通過在網(wǎng)頁中隱藏一些人眼不能發(fā)現(xiàn)但爬蟲訪問能夠訪問但鏈接來識別爬蟲。

基于自定義cookie的檢測技術(shù)是一種基于日志分析的主動抵御爬蟲的策略,該策略是通過在網(wǎng)站的接口中增加了一些加密參數(shù)來實(shí)現(xiàn)的,瀏覽器通過執(zhí)行返回的JS代碼得到具有時(shí)效性以及機(jī)密性的結(jié)果,并將結(jié)果添加到cookie中,再次發(fā)起請求時(shí)攜帶,正常人類訪問者和惡意爬蟲的訪問過程如圖2所示。

圖片

圖2 正常人類訪問者和惡意爬蟲的訪問流程圖

具體而言,向客戶端返回JS代碼,并通過客戶端執(zhí)行JS代碼的結(jié)果來主動抵御爬蟲。cookie的生成過程可以融合客戶端瀏覽器的特性,該特性檢測只有在真實(shí)的瀏覽器和真實(shí)用戶訪問行為的情況下才能完成,而無法在一些瀏覽器內(nèi)核模擬器上或者一些偽造了請求頭User-Agent的情況下得到。比如,服務(wù)器返回的檢測腳本用于檢測瀏覽器是否存在某個(gè)bug,針對實(shí)際的瀏覽器而言,該瀏覽器本身是存在該bug的,但爬蟲程序中偽造的瀏覽器運(yùn)行該檢測腳本生成對應(yīng)cookie時(shí),則不會得到正確的cookie,因此可斷定訪問用戶為爬蟲。再如,cookie生成腳本中融合瀏覽器是否具有網(wǎng)頁翻譯的功能,針對實(shí)際的瀏覽器而言,該瀏覽器本身是具有網(wǎng)頁翻譯功能的,但客戶端的瀏覽器運(yùn)行該檢測腳本時(shí),執(zhí)行網(wǎng)頁翻譯功能失敗,因此也可斷定訪問用戶為爬蟲。


針對以自定義cookie為基礎(chǔ)的爬蟲檢測技術(shù),瀏覽器可以通過執(zhí)行JS代碼獲取到后端認(rèn)可的結(jié)果,同理,攻擊者也可以通過攔截JS代碼并對其分析,從而達(dá)到同樣的目的。因此返回的JS代碼需要具備反攔截以及不易逆向的特點(diǎn),此時(shí)將JavaScript-obfuscator混淆技術(shù)結(jié)合到基于自定義cookie的檢測技術(shù)中,保證代碼安全。此處的JavaScript-obfuscator混淆技術(shù)通常包含JS代碼壓縮、混淆與加密技術(shù)。

4.JS代碼壓縮、混淆與加密

JS代碼壓縮是去除JS代碼中的不必要的空格、換行等內(nèi)容,使源碼壓縮為幾行內(nèi)容,降低代碼可讀性,同時(shí)也可以提高網(wǎng)站的加載速度。

JS代碼混淆是一種較為理想、實(shí)用的代碼保護(hù)方案,通過使用變量混淆、字符串混淆、反格式化、控制流平坦化、無用代碼注入、對象鍵名替換、禁用控制臺輸出、調(diào)試保護(hù)、域名鎖定等手段,在不影響代碼原有功能的基礎(chǔ)上,使代碼變得難以閱讀和分析,達(dá)到最終保護(hù)的目的。JS代碼加密是通過某種手段將JS代碼進(jìn)行加密,轉(zhuǎn)成人無法閱讀或者解析的代碼或?qū)⒋a完全抽象化加密。

常見的JS代碼加密技術(shù)有JSfuck、AAEncode、JJEncode、eval加密。JSfuck、AAEncode、JJEncode加密技術(shù)利用各自的符號庫對JS代碼進(jìn)行編碼,eval加密往往也都是以eval(p,a,c,k,e,r)或者是eval(function(p,a,c,k,e,d)作為代碼開頭。以上四種加密方式加密特征明顯,易于解碼,利用瀏覽器的開發(fā)者工具均可以完全還原,與此同時(shí)eval加密技術(shù)壓棧很嚴(yán)重,可能出現(xiàn)內(nèi)存溢出情況,所以只適合核心功能加密。特別的,JJEncode有瀏覽器依賴,代碼不能在某種瀏覽器上運(yùn)行。另外還有更強(qiáng)大的加密技術(shù),可以直接將JS代碼用C/C++實(shí)現(xiàn),瀏覽器調(diào)用其編譯后形成的文件來執(zhí)行相應(yīng)的功能,如Emscripten、WebAssembly。

變量混淆是將帶有含義的變量名、方法名、常量名隨機(jī)變?yōu)闊o意義的類亂碼字符串,降低代碼可讀性,如轉(zhuǎn)成單個(gè)字符或十六進(jìn)制字符串。

字符串混淆是將字符串陣列化集中放置、并可進(jìn)行MD5或Base64加密存儲,使代碼中不出現(xiàn)明文字符串,這樣可以避免使用全局搜索字符串的方式定位到入口點(diǎn)。

JS代碼格式化的原因是由于保存到本地的JS文件被壓縮且不利于觀察,格式化即美化,反格式化即如果對JS代碼進(jìn)行格式化,則無法執(zhí)行,導(dǎo)致瀏覽器假死??刂屏髌教够ㄟ^打亂函數(shù)原有代碼執(zhí)行流程及函數(shù)調(diào)用關(guān)系,在邏輯處理塊前統(tǒng)一加上驅(qū)動邏輯塊,使代碼邏變得混亂無序,簡單來講就是將代碼塊之間的關(guān)系打斷,由一個(gè)分發(fā)器來控制代碼塊的跳轉(zhuǎn),如圖3和圖4所示。

圖片

圖3 混淆前的代碼流程圖

圖片

圖4 混淆后的代碼流程圖

無用代碼注入是隨機(jī)在代碼中插入不會被執(zhí)行到的無用代碼,進(jìn)一步使代碼看起來更加混亂。禁用控制臺輸出是通過置空控制臺方法(console.log, console.debug, console.info, console.error, console.exception, console.trace, console.warn)的方式實(shí)現(xiàn)的。調(diào)試保護(hù)是基于調(diào)試器特性,對當(dāng)前運(yùn)行環(huán)境進(jìn)行檢驗(yàn),加入一些強(qiáng)制調(diào)試debugger語句,使其在調(diào)試模式下難以順利執(zhí)行JS代碼。域名鎖定是使JS代碼只能在指定域名下執(zhí)行。

5.JavaScript-obfuscator混淆

在前端開發(fā)中,作為JS混淆主流的實(shí)現(xiàn),JavaScript-obfuscator庫和terser庫提供了一些代碼混淆功能,也都有對應(yīng)的Webpack 和Rollup打包工具的插件,從而方便實(shí)現(xiàn)頁面的混淆,最終輸出壓縮和混淆后的JS代碼,使得JS代碼可讀性大大降低,JavaScript-obfuscator的混淆選項(xiàng)如圖5所示。

圖片

圖片

圖5 JavaScript-obfuscator混淆的混淆選項(xiàng)

JavaScript-obfuscator混淆有眾多的參數(shù),但JavaScript-obfuscator混淆后代碼的抽象語法樹依次包含以下結(jié)構(gòu):大數(shù)組-->數(shù)組移位-->解密函數(shù)-->控制流平坦化后的核心代碼-->無限debugger自執(zhí)行函數(shù)+死代碼注入。整體ob的強(qiáng)度幾乎完全取決于這四段的代碼強(qiáng)度,其中包含加密前的邏輯。

常用混淆工具有YUI Compressor、Google Closure Compiler、UglifyJS、JScrambler以及JavaScript-obfuscator系工具(obfuscator.io、soJSon v5.0 v6.0、JShaman)。

6.總結(jié)

爬蟲貢獻(xiàn)了互聯(lián)網(wǎng)50%的流量,它對于互聯(lián)網(wǎng)的繁榮功不可沒,但該技術(shù)同時(shí)也因“用途”而充滿爭議,爬蟲與反爬蟲一直處于互相博弈的狀態(tài)。此消彼長,在這一過程中反爬蟲漸漸發(fā)展為具備智能交互、數(shù)據(jù)采集、實(shí)時(shí)計(jì)算、模型分析以及決策判斷等能力綜合性安全系統(tǒng),而不再是一個(gè)簡易工具。相信隨著監(jiān)管越來越嚴(yán)格,爬蟲技術(shù)的使用邊界也將更加明晰,互聯(lián)網(wǎng)環(huán)境也將越來越清澈。

責(zé)任編輯:龐桂玉 來源: 移動Labs
相關(guān)推薦

2022-09-14 23:06:45

2022-09-20 07:02:20

網(wǎng)絡(luò)爬蟲反爬蟲

2018-01-29 09:28:44

2016-10-13 15:51:50

2021-06-10 18:24:59

反爬蟲驗(yàn)證碼爬蟲

2016-10-14 16:35:39

2021-06-06 19:53:05

爬蟲處理字體反爬

2024-06-07 08:56:43

HTTPPythonSelenium

2017-06-30 13:23:02

2009-08-19 10:34:16

反爬蟲

2023-06-01 13:15:23

2017-05-16 15:33:42

Python網(wǎng)絡(luò)爬蟲核心技術(shù)框架

2017-05-15 10:39:48

爬蟲應(yīng)對機(jī)制

2021-01-12 11:26:44

數(shù)據(jù)安全爬蟲

2017-04-27 20:45:48

爬蟲反爬蟲

2021-10-15 11:37:44

反爬蟲破解

2016-10-13 13:01:51

2019-10-18 08:52:41

程序員爬蟲Java

2024-05-31 12:31:54

C#爬蟲Python

2021-06-09 18:22:11

反爬蟲破解
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號