日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

服务端如何识别是selenium在访问以及解决方案参考一

發(fā)布時間:2024/1/23 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 服务端如何识别是selenium在访问以及解决方案参考一 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用selenium模擬瀏覽器進行數(shù)據(jù)抓取無疑是當下最通用的數(shù)據(jù)采集方案,它通吃各種數(shù)據(jù)加載方式,能夠繞過客戶JS加密,繞過爬蟲檢測,繞過簽名機制。它的應用,使得許多網(wǎng)站的反采集策略形同虛設。由于selenium不會在HTTP請求數(shù)據(jù)中留下指紋,因此無法被網(wǎng)站直接識別和攔截。

這是不是就意味著selenium真的就無法被網(wǎng)站屏蔽了呢?非也。selenium在運行的時候會暴露出一些預定義的Javascript變量(特征字符串),例如"window.navigator.webdriver",在非selenium環(huán)境下其值為undefined,而在selenium環(huán)境下,其值為true(如下圖所示為selenium驅(qū)動下Chrome控制臺打印出的值)。

除此之外,還有一些其它的標志性字符串(不同的瀏覽器可能會有所不同),常見的特征串如下所示:

  • webdriver??
  • __driver_evaluate??
  • __webdriver_evaluate??
  • __selenium_evaluate??
  • __fxdriver_evaluate??
  • __driver_unwrapped??
  • __webdriver_unwrapped??
  • __selenium_unwrapped??
  • __fxdriver_unwrapped??
  • _Selenium_IDE_Recorder??
  • _selenium??
  • calledSelenium??
  • _WEBDRIVER_ELEM_CACHE??
  • ChromeDriverw??
  • driver-evaluate??
  • webdriver-evaluate??
  • selenium-evaluate??
  • webdriverCommand??
  • webdriver-evaluate-response??
  • __webdriverFunc??
  • __webdriver_script_fn??
  • __$webdriverAsyncExecutor??
  • __lastWatirAlert??
  • __lastWatirConfirm??
  • __lastWatirPrompt??
  • $chrome_asyncScriptInfo??
  • $cdc_asdjflasutopfhvcZLmcfl_??
  • 了解了這個特點之后,就可以在瀏覽器客戶端JS中通過檢測這些特征串來判斷當前是否使用了selenium,并將檢測結(jié)果附加到后續(xù)請求之中,這樣服務端就能識別并攔截后續(xù)的請求。

    下面講一個具體的例子。

    鯤之鵬的技術(shù)人員近期就發(fā)現(xiàn)了一個能夠有效檢測并屏蔽selenium的網(wǎng)站應用:大眾點評網(wǎng)的驗證碼表單頁,如果是正常的瀏覽器操作,能夠有效的通過驗證,但如果是使用selenium就會被識別,即便驗證碼輸入正確,也會被提示“請求異常,拒絕操作”,無法通過驗證(如下圖所示)。

    分析頁面源碼,可以找到 https://static.meituan.net/bs/yoda-static/file:file/d/js/yoda.e6e7c3988817eb17.js 這個JS文件,將代碼格式化后,搜索webdriver可以看到如下代碼:

    ?可以看到它檢測了"webdriver", "__driver_evaluate", "__webdriver_evaluate"等等這些selenium的特征串。提交驗證碼的時候抓包可以看到一個_token參數(shù)(很長),selenium檢測結(jié)果應該就包含在該參數(shù)里,服務端借以判斷“請求異常,拒絕操作”。

    現(xiàn)在才進入正題,如何突破網(wǎng)站的這種屏蔽呢?

    我們已經(jīng)知道了屏蔽的原理,只要我們能夠隱藏這些特征串就可以了。但是還不能直接刪除這些屬性,因為這樣可能會導致selenium不能正常工作了。我們采用曲線救國的方法,使用中間人代理,比如fidder, proxy2.py或者mitmproxy,將JS文件(本例是yoda.*.js這個文件)中的特征字符串給過濾掉(或者替換掉,比如替換成根本不存在的特征串),讓它無法正常工作,從而達到讓客戶端腳本檢測不到selenium的效果。

    下面我們驗證下這個思路。這里我們使用mitmproxy實現(xiàn)中間人代理),對JS文件(本例是yoda.*.js這個文件)內(nèi)容進行過濾。啟動mitmproxy代理并加載response處理腳本:

  • mitmdump.exe?-S?modify_response.py??
  • 其中modify_response.py腳本如下所示:

    # coding:utf-8 # modify_response.pyimport re from mitmproxy import ctxdef response(flow):"""修改應答數(shù)據(jù)"""if '/js/yoda.' in flow.request.url:# 屏蔽selenium檢測for webdriver_key in ['webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:ctx.log.info('Remove"{}"from{}.'.format(webdriver_key,flow.request.url))flow.response.text=flow.response.text.replace('"{}"'.format(webdriver_key),'"NO-SUCH-ATTR"')flow.response.text=flow.response.text.replace('t.webdriver','false')flow.response.text=flow.response.text.replace('ChromeDriver','')

    在selnium中使用該代理(mitmproxy默認監(jiān)聽127.0.0.1:8080)訪問目標網(wǎng)站,mitmproxy將過濾JS中的特征符串,如下圖所示:

    經(jīng)多次測試,該方法可以有效的繞過大眾點評的selenium檢測,成功提交大眾點評網(wǎng)的驗證碼表單。

    轉(zhuǎn)載自:http://www.site-digger.com/html/articles/20180821/653.html

    總結(jié)

    以上是生活随笔為你收集整理的服务端如何识别是selenium在访问以及解决方案参考一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。