商標局網請收下我的膝蓋-反爬與反反爬的奇技淫巧

今天打算寫最後一篇的反爬與反反爬的文章了,畢竟奇技淫巧很多,但是萬變不離其宗,熟練掌握JS/HTML/CSS,了解HTTP協議,這是內功。熟練使用chrome,神箭手開發框架,這是稱手的兵器。剩下的也就是唯手熟爾。

後面打算開一個番外系列,不少人私信問我關於cnn識別驗證碼的問題,所以打算開一個系列跟大家一起看看咱們用機器學習能解決多少驗證碼識別的問題。感興趣的朋友歡迎關注我或者專欄:

我:吳桐-神箭手CEO

專欄:數據黑板-知乎專欄

好了,廢話不多說,先上之前的文章列表:

爬蟲被封IP了怎麼辦-反爬與反反爬的奇技淫巧

爬蟲中的驗證碼識別-反爬與反反爬的奇技淫巧

爬蟲中Cookie的偽造(非登錄)-反爬與反反爬的奇技淫巧

爬蟲與詭異的字體-反爬與反反爬的奇技淫巧

爬蟲與汽車之家的Css:Content-反爬與反反爬的奇技淫巧

爬蟲與CloudFlare郵箱加密(cfemail)-反爬與反反爬的奇技淫巧

那些年攜程工程師在代碼里下的毒-反爬與反反爬的奇技淫巧

一眼望去已經有不少文章了,不過也應該只覆蓋了所有套路的一部分吧,今天既然是壓軸,我們就來聊一個難的,詭異的,不一樣的,眼前一亮的。常規的單獨套路顯然就很難符合標準,今天咱們要聊的是一個超級組合拳直接讓人懷疑人生的反爬套路--商標局(商標檢索平台)。

首先呢,我們的文章只是技術探索的目的。商標局的網站反爬據說是一家專業安全企業的產品-瑞數 ,我們不會在這篇文章中教大家完整去破解這套系統。我們一起來通過研究這套系統,看看我們有什麼可以借鑒的地方,這套策略到底有什麼牛逼的地方。同時提高我們的反爬與反反爬的能力,當然最重要的是提高JS水平。

好了,既然是組合拳,咱們就一個一個拳頭來:

第一拳:防調試

咱們依照套路,直接打開網站,右擊打開調試面板。Boom!

直接斷點,咱們還啥都沒做呢,點擊繼續,Boom!又斷點。這還沒上戰場,就已經被打殘了。

首先不得不說專業的就是專業的,這招簡直是不戰而屈人之兵。很多人走到這,就已經決定去用無頭瀏覽器了(當然無頭瀏覽器的坑也很多,更致命的是靈活性太差)

這裡有一個不算完美的解決方案,就是我安利了無數篇文章的chrome snippets,這裡可以明顯看到,這個手法是內嵌了一個setinterval的函數,每一個間隔時間,就調用一次debugger讓瀏覽器斷點,我們只需要清楚掉這個interval即可,大家可以複製一下下面的代碼在console中執行,或者直接保存成snippet每次斷點後執行再點繼續即可。

for (var i = 1; i < 99999; i++)n window.clearInterval(i);n

第二拳:JS驗證後跳轉

閃過第一拳,第二拳迅速襲來,網頁本身並不是直接打開的,而是經過了一次JS跳轉,跳轉到了這樣一個網址上:

http://wsjs.saic.gov.cn/txnT01.do?y7bRbP=KaltkM10zh10zh10triDHWegi3_iGKEpBPgY7GGba.An

JS跳轉是很多網站驗證真實瀏覽器的方式(比如還有搜狗搜索),當然商標網的這個JS跳轉那也真是成精了。由於直接在Chrome中即使勾上preserved log也拿不到具體頁面,我們通過postman來提交一個請求看看真實的返回數據:

這代碼看著也真實讓人精神抖擻啊,關於這類JS的調試,我已經在上篇文章中,有著相對詳細介紹,如果還是沒有掌握其中奧義的朋友們,可以自行學習,我就不詳細講了。這裡特別注意幾個細節:

1.這裡不僅僅純粹JS需要執行,還有一個重要的meta標籤和一個外部引用的JS文件都需要模擬到Snippets里去,而且必須要對應上,否則函數名就會錯亂。

2.實際代碼運行過程中,還有兩套JS的eval執行,謹記用console.log替換eval的套路。

3.代碼中有部分代碼調用了eval.call的方法,注意此方法會將context換成全局的context執行,模擬的時候務必弄清環境以免變數錯亂。

4.模擬真實瀏覽器環境的過程中,類似攜程的new Image()套路,這套反爬代碼中也下了不少毒。比如navigator的hasOwnProperty,大家在模擬環境變數時一定做到真實模擬,比如內置變數盡量使用定義prototype後new的形式,而不要直接定義一個變數:

Navigator.prototype = {"appVersion":"5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",n "appCodeName":"Mozilla",n "appName":"Netscape",n "language":"zh-CN",n "platform":"Win32",n "productSub":"20030107",n "product":"Gecko",n "mimeTypes":[n {"type":"application/pdf","description":"","enabledPlugin":{"name":"PDF Viewer"}},n {"type":"application/x-shockwave-flash",suffixes:"swf",n "description":"Shockwave Flash","enabledPlugin":{"name":"Shockwave Flash","description":"Shockwave Flash 26.0 r0"}}n ],n "userAgent":site.getUserAgent(),n "languages": ["zh-CN", "zh"],n "plugins":[n {"name":"Shockwave Flash","description":"Shockwave Flash 26.0 r0",length:2,filename:"pepflashplayer64_26_0_0_151.dll"}n ]n};n navigator = new Navigator();n

5.代碼中有大量dom操作,但是我們模擬環境是不可能模擬所有dom操作的(真全部模擬出來就是個無頭瀏覽器了,這工作量不可想像)所以建議先寫一個空dom函數的,看看具體的調用形式,比如document.getElementById之類,列印一下看看如何調用,然後在模擬具體場景下的使用,比如獲取meta標籤的content。

6.調試過程中會發現正常運行可以,但是一旦調試則亂碼,此處又是工程師下的劇毒,通過比對執行時間差來判斷是否是有人在debug,此處解決方案可執行如下代碼替換Date的默認執行來騙過JS:

Date.prototype._getTime = Date.prototype.getTime;nDate.prototype.getTime = function(){n if(!Date._lastTime){n var time = this._getTime();n Date._lastTime = time;n }n Date._lastTime = Date._lastTime+100;n return Date._lastTime;n}n

7.耐心!耐心!耐心!由於此處套路之深讓攜程工程師都看不到底,所以調試的耐心非常重要。

第三拳:Cookie的定時刷新

其實如果我沒猜錯,第二拳打完,估計地上應該已經全是屍體了,不過記得當年遊戲里的一句話:十人九不回,強者屍上行(又暴露年齡了)。

咱們繼續前行,看看這第三拳:Cookie定時刷新。此處套路已經要突破天際了,宇宙邊緣才是這套路的終點。此處JS通過將點擊行為,停留時間等等以加密形式存入Cookie中,並定時刷新,幾乎做到讓想要模擬的人走投無路,不過值得慶幸的是如果順利挺過第二拳,這第三拳只需要加上一個對瀏覽器事件機制的模擬即可順利過關。

第四拳:瀏覽器內置函數Hook

估計到了第四拳,不少內功差的朋友已經不知道我在說什麼了。如果還能看懂的話,咱們繼續:

這套反爬最讓我們嘆為觀止的,就是這第四拳,真的是非常的優雅。又把安全做到了幾乎是前段的極致。系統通過對XMLHttpRequest的Hook,將所有的Ajax請求都添加上了get參數,就算普通調試,甚至都完全看不出來get參數是再什麼地方加的。不過解決方案當然也很簡單,就是對XMLHttpRequest先做一次Hook,在執行代碼。

第五拳:表單提交代替鏈接

這個套路雖然不深,但確實也給調試帶來了深深的影響,然而還好走到這的朋友估計已經對這套代碼爛熟於心,只需要跳過表單提交,通過其他方案直接獲取Url和get參數,同時通過Hook函數document.write就可以完美模擬出表單提交的效果。

話說後面兩拳我就不展開了說了,躲過這幾拳之後,剩下的就非常簡單了,最後的頁面連一個ajax都沒有,直接xpath就可以全部解析出來。如果大家想把JS提升5678個檔次,可以來嘗試下商標局網的爬蟲。這個爬蟲寫出來之後,你會發現攜程爬蟲真的也只算得上小學水平吧。

--------------------------------------------------最後說兩句----------------------------------------------------------

咱們反爬和反反爬系列就此告一段落了,還是開頭說了,套路很多,一一列舉沒啥意思,大家掌握思想精髓,做到舉一反三,才能真正通往大神之路。

歡迎大家繼續關注我和我的專欄,下面開啟一個新系列《驗證碼終結者》,跟大家一起通過新武器-人工智慧來會會這個爬蟲的老對手(參看爬蟲中的驗證碼識別-反爬與反反爬的奇技淫巧)。

更多回答關註:吳桐-神箭手CEO

更多文章關註:數據黑板-知乎專欄


推薦閱讀:

TAG:爬虫计算机网络 | 大数据 | 商标查询 |