1. ホーム
  2. ジャワ

Dodge ブラウザによるセレンの検出

2022-03-16 12:01:25

ほとんどのウェブサイトは、ブラウザがselenium起動されているかどうかを判断するためにブラウザのパラメータを検出し、我々は特定のメソッドを実行するためにseleniumを使用している間に特定のパラメータを表示するようにしてもよい(navigator.webdriver、webdriverはheadなしでUAに表示)、だから私はできるだけサイトに検出されないようにこれをエッセイを書いています。

第一幕

参考 javascript - chromedriverでSeleniumを使用しているとき、ウェブサイトはそれを検知することができますか?  この回答は非常に好感が持てます。

このサイトでは、特定のパラメータ $cdc_asdjflasutopfhvcZLmcfl を検出していますが、もちろんそれ以外にも多くのパラメータが存在します。

ウェブ上では、mitmproxy を使ってパラメータを変更するリクエストを傍受している人がたくさんいます。

コピーコード

import re
from mitmproxy import ctx

def response(flow): 
    if '/js/yoda.' in flow.request.url:
        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', '')

<イグ

これは、Stackflowの回答者が行ったように、chromedriverの下位バージョンを、対応するクロームのバージョンに合わせてデコンパイルすることが一部と言えます。どちらのバージョンにもそれぞれの特徴がありますが、すべての検出を回避する方法はありません。オープンソースのseleniumを使っても、操作のためにページを開いた後にどのパラメータが変更されるかを調べるだけのエネルギーはありません。

クロメドライバーのデコンパイル版はこちら:バージョン 76.0.3809.100 (公式) (64 ビット)

リンク: https://pan.baidu.com/s/1a_rn6mdI4v_ndOwnVRxMHA

抽出コード: jkhy


第二幕 これは、より多くの検出を回避する可能性があります

この方法の原理は、通常のブラウザの設定であるクロームの設定ファイルから継承されるクロームのデバッグモードを使用することです。

まずクロームブラウザを全て終了し(重要、以下を読んでから終了)、chrome.exeのあるディレクトリ(Windowsは一般的にC: \Program Files (x86)╱GoogleChromeApplication)にcmdで移動し実行します。

<テーブル

chrome.exe 
-
-
remote
- -
debugging
-
port
=
9222

このコマンドは、ポート9222でクロームのデバッグモードを開きます。

そして、Webdriverを呼び出す際にdebuggerAddressを渡します。

コピーコード

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(executable_path='D://chromedriver.exe', options=options)
driver.get('https://login.taobao.com')

<イグ

 第三幕

GoogleのChrome Devtools-Protocol(cdp)を使って、cdpコマンドを実行すると、検出を回避することができる

Page.addScriptToEvaluateOnNewDocument "各Frameが開かれたばかりで、そのFrameに対して何もスクリプトが実行されていない状態で、指定されたスクリプトを実行します。

cdpプロトコルはクロームに偏っているという利点がありますが、execute_scriptはseleniumパラメータを取るので、簡単に検出されます。

コピーコード

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""",
    })

  注意:クロームの低いバージョンはcdpプロトコルをサポートしていないので、クロームのバージョンを79以上に保つようにしてください。