chromedriverでセレンを使用しているときにWebサイトで検出できますか?


365

私はChromedriverでSeleniumをテストしてみましたが、自動化がまったくなくても、一部のページでSeleniumの使用を検出できることに気付きました。SeleniumとXephyrでChromeを使用して手動で閲覧しているだけでも、不審なアクティビティが検出されたというページがよく表示されます。ユーザーエージェントとブラウザの指紋を確認しましたが、すべて通常のChromeブラウザとまったく同じです。

これらのサイトを通常のChromeで閲覧すると、すべて正常に動作しますが、Seleniumを使用した瞬間に検出されます。

理論的には、chromedriverとchromeはどのWebサーバーでも文字通りまったく同じに見えるはずですが、どういうわけかそれらを検出できます。

テストコードが必要な場合は、これを試してください:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

スタブハブを参照すると、1つまたは2つのリクエストでリダイレクトされ、「ブロック」されます。私はこれを調査しており、ユーザーがSeleniumを使用していることを彼らがどのように知ることができるかわかりません。

どうやってやっているの?

更新を編集:

FirefoxにSelenium IDEプラグインをインストールしましたが、追加のプラグインのみを使用して通常のFirefoxブラウザでstubhub.comにアクセスすると禁止されました。

編集:

Fiddlerを使用して、送受信されるHTTPリクエストを表示すると、「偽のブラウザー」のリクエストの応答ヘッダーに「no-cache」が含まれていることがよくあります。

編集:

このような結果JavascriptからSelenium Webdriverページにいることを検出する方法はありますかWebドライバーを使用しているときに検出する方法はないはずです。しかし、この証拠はそうでないことを示唆しています。

編集:

サイトはサーバーにフィンガープリントをアップロードしていますが、チェックしたところ、セレンのフィンガープリントはクロムを使用した場合のフィンガープリントと同じです。

編集:

これは、サーバーに送信するフィンガープリントペイロードの1つです。

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

セレンとクロムで同じ

編集:

VPNは1回の使用で機能しますが、最初のページをロードした後で検出されます。明らかに、Seleniumを検出するためにいくつかのJavaScriptが実行されています。


4
@RyanWeinstein:トラフィックではありません。私の推測では、Seleniumはクライアント側のJavaScriptで検出できるいくつかのJavaScriptフックを公開する必要があります。
Mikko Ohtamaa

5
または、トラフィックの場合はトラフィックパターンです。ページの閲覧が速すぎます。
Mikko Ohtamaa

6
ブラウジングが速すぎません。1つのページのみを読み込み、通常はマウスとキーボードを使用してページを移動します。また、文字通りchrome.exeを実行しているため、Seleniumがフックを公開する必要があることは意味がありません。通常のクロムを実行するだけで、そこからデータを取得できます。他のアイデアは?多分それはクッキーと関係があると思っていました。これは私を夢中にさせています。
Ryan Weinstein

5
このサイトでは、使用するdistillボット検出技術を使用しておよびコンテンツ提供akamaitechnologies.com切り抜いたIPSなどからCDNを95.100.59.245104.70.243.6623.202.161.241
SIslam

5
SeleniumとFirefoxドライバーで同じ問題が発生しています。興味深い点は、NATを介してインターネットにアクセスしているVMWareワークステーション仮想マシンでSeleniumを実行していることです。ホストマシンはスタブハブにアクセスできますが、Selenium、またはSeleniumが起動したブラウザインスタンスを使用している場合、VMはアクセスできません。VMブラウザーインスタンスをブロックしましたが、stubhubはまだマシンを認識し、ブロックしています。したがって、何らかの方法でブラウザとマシンのフィンガープリントを実行している必要があります。
ブライアンカイン

回答:


54

Macユーザー向け

cdc_VimまたはPerlを使用して変数を置き換える

を使用するvimか、@ Vic Seedoubleyewが回答で@ Erti-Chris Eelmaaによって指摘したperlように、cdc_変数を置き換えることができますchromedriver(その変数の詳細については、@ Erti-Chris Eelmaaによる投稿を参照してください)。ソースコードを再コンパイルしたり、16進エディターを使用しvimたりperlする必要があるか、それを防ぐ。chromedriver編集する前に、必ず元のコピーを作成してください。また、以下のメソッドはでテストされましたchromedriver version 2.41.578706


Vimの使用

vim /path/to/chromedriver

上記の行を実行すると、おそらく意味不明なことがたくさん表示されます。以下をせよ:

  1. cdc_入力して検索します。/cdc_return
  2. を押して編集を有効にしaます。
  3. 任意の量を$cdc_lasutopfhvcZLmcfl削除し、削除されたものを同じ量の文字で置き換えます。そうしないと、chromedriver失敗します。
  4. 編集が完了したら、を押しescます。
  5. 変更を保存して終了するには、を入力して:wq!を押しreturnます。
  6. 変更を保存したくないが、終了したい場合は、を入力して:q!を押しreturnます。
  7. 完了です。

変更された場所に移動してchromedriverダブルクリックします。terminalウィンドウが開くはずです。killed出力に表示されない場合は、ドライバーが正常に変更されています。


Perlの使用

以下の行はcdc_、に置き換えられdog_ます。

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

置換文字列の文字数が検索文字列と同じであることを確認してくださいchromedriver。それ以外の場合は失敗します。

Perlの説明

s///g 文字列を検索し、それをグローバルに別の文字列に置き換える(すべての出現箇所を置き換える)ことを示します。

例えば、 s/string/replacment/g

そう、

s/// 文字列の検索と置換を示します。

cdc_ 検索文字列です。

dog_ 置換文字列です。

g 文字列のすべての出現箇所を置き換えるグローバルキーです。

Perlの置換が機能したかどうかを確認する方法

次の行は、検索文字列をすべて表示しますcdc_

perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver

これが何も返さない場合cdc_は、交換されています。

逆に、これを使用できます:

perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver

置換文字列dog_chromedriverバイナリに含まれているかどうかを確認します。その場合、置換文字列がコンソールに出力されます。

変更された場所に移動してchromedriverダブルクリックします。terminalウィンドウが開くはずです。killed出力に表示されない場合は、ドライバーが正常に変更されています。


まとめ

chromedriverバイナリを変更した後、変更されたchromedriverバイナリの名前がであるchromedriverこと、および元のバイナリが元の場所から移動されたか、名前が変更されていることを確認してください。


この方法での私の経験

以前、ログイン中にWebサイトで検出されていましたがcdc_、同じサイズの文字列に置き換えた後、ログインすることができました。この方法を使用した後でも、他の多くの理由があります。そのため、VPN、別のネットワーク、または何を使用しているかを検出しているサイトにアクセスする必要がある場合があります。


@LekaBaper頭を上げてくれてありがとう。私が使用したchromedriverのバージョンはバージョン2.41.578706でした。
colossatr0n

2
別のネットワーク上の新しい物理コンピューターでこのchromedriver.exeの変更を使用しても機能しませんでした。
Ahmed Memon

エラーが表示され、このバージョンはこのコンピューターでは機能しません:(
Walid Bousseta

@ colossatr0n気付いている検出できないオープンソースのフォークはありますか?
ishandutta2007

3
chromedriverの人々はこの問題は修正されないと宣言しているので、将来的にはフォークを使用するか、バイナリを編集する必要があると予想できます。bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiologist

144

基本的に、セレンの検出が機能する方法は、セレンで実行したときに表示される定義済みのJavaScript変数をテストすることです。ボット検出スクリプトは、通常、何も言葉を含む(ウィンドウオブジェクトの)変数のいずれかで「セレン」/「webdriverを」、とも呼ばれる文書変数に見える$cdc_とし$wdc_。もちろん、これはすべて、使用しているブラウザによって異なります。すべての異なるブラウザーは異なるものを公開します。

私にとっては、私はクロムを使用し、ので、私がしなければならなかったことをすべて行うには、それが確実になった$cdc_文書変数としてもはや存在し、出来上がりませんでした(ダウンロードchromedriverのソースコード、変更chromedriver再コンパイル$cdc_別の名前で。)

これは、chromedriverで変更した関数です。

call_function.js:

function getPageCache(opt_doc) {
  var doc = opt_doc || document;
  //var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  var key = 'randomblabla_';
  if (!(key in doc))
    doc[key] = new Cache();
  return doc[key];
}

(すべての私は変わったのコメントを注意$cdc_しますrandomblabla_

以下は、ボットネットワークが使用する可能性があるいくつかの手法を示す疑似コードです。

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

ユーザー@szxによると、16進エディターでchromedriver.exeを開くだけで、実際にはコンパイルせずに手動で置き換えるだけです。


26
はい、問題なく動作しました。1つの問題は、この変更の前に「ブラックリスト」に陥った場合、抜け出すのが非常に難しいことです。既存のブラックリストから抜け出すには、偽のキャンバスフィンガープリントを実装し、フラッシュを無効にし、IPを変更し、リクエストヘッダーの順序を変更する必要があります(言語のスワップとヘッダーの受け入れ)。あなたはブラックリストに落ちたら、彼らは、あなたがIPを変更しても、あなたを追跡するために非常に良い策を持っていてもお忍びで開くクロムなどの場合
ERTI-クリスEelmaa

2
「/ Users / your_username / chromium / src / chrome / test / chromedriver / js」というファイルを見つけました
JonghoKim

7
私は単純に置き換える$cdcxxxxしてchromedriver.exeバイナリエディタで、それが働きました!また、ブラウザーウィンドウを最大化すると(定義済みのサイズを使用するのではなく)、検出される頻度が低くなることにも気付きました。
szx

2
これは、windows、osx、linuxのどれですか?OSXでの16進編集が機能していないようです。
ニッシュ

5
$ zzz_zzzzzzzzzzzzzzzzzzzzzz_(同じ文字数)で16進編集されましたが、機能しませんでした。
Aymon Fournier 2018

100

質問と投稿された回答ですでに理解しているように、ここでは「Distil Networks」と呼ばれるWebスクレイピング対策とボット検出サービスが機能しています。そして、会社のCEOのインタビューによると:

新しいボットを作成することはできますが、使用しているツールがSeleniumであることを確認する方法を見つけたので、そのボットで何度繰り返してもSeleniumをブロックしています。私たちは今、Pythonとさまざまなテクノロジーを使ってそれを行っています。あるタイプのボットからパターンが出現したら、使用するテクノロジーをリバースエンジニアリングして悪意のあるものとして識別します。

彼らがどのようにしてセレンを正確に検出しているかを理解するには、時間と追加の課題が必要ですが、現時点では確かに何が言えるでしょうか。

  • これは、Seleniumで実行するアクションとは関係ありません。サイトに移動すると、すぐに検出されて禁止されます。私はアクションの間に人工的なランダムな遅延を追加しようとしました、ページがロードされた後に一時停止します-何も役に立たなかった
  • それはブラウザの指紋についてでもありません-複数のブラウザでクリーンなプロファイルを使って試してみましたが、シークレットモードではありません-何の助けにもなりませんでした
  • インタビューのヒントによると、これは「リバースエンジニアリング」であったため、ブラウザでJSコードを実行してこれが行われたのではないかと思います。

明らかに次のように回答として投稿することにしました。

chromedriverでセレンを使用しているときにWebサイトで検出できますか?

はい。


また、私が実験していないのは、古いセレンと古いブラウザバージョンです。理論的には、Distil Networksボット検出器が現在依存している特定の時点でセレンに実装/追加されたものがある可能性があります。次に、これが当てはまる場合、関連する変更が行われたポイント/バージョンを検出し(そう、検出器を検出しましょう)、変更ログと変更セットを調べ、場合によっては、どこを見ればよいかについてより多くの情報を得ることができますまた、Webドライバーを搭載したブラウザーを検出するために使用するものは何ですか。これは、テストが必要な理論にすぎません。


@RyanWeinsteinよく、実際の証拠はなく、推測とテストしかできません。今のところ、セレンを使用して私たちを検出する方法があると思います。セレンバージョンを試してみてください-これはいくつかの手掛かりを与えるかもしれません。
alecxe 2015年

1
短命なポートがどのように決定されるかと関係がありますか?このメソッドは、既知の範囲から離れています。github.com/SeleniumHQ/selenium/blob/...
エリオット・デ・ローネー

9
Easyjetはdistilnetworkサービスを使用しています。そうではありません。異なるIPから1日に2000を超えるリクエストでテストしているため、ダミーのボットはブロックできますが、複雑なボットはブロックできません(同じ「同じ」アドレスを再利用します)。 1日5〜10回のリクエストで、このボット検出サービスはすべて、45%動作するアルゴリズムを開発して販売するためだけにあることがわかります。使用したスクラッパーは簡単に検出でき、destilnetworks、squareshieldなどをブロックできます。私はそれらのいずれも使用しないようにプッシュすることができませんでした。
Jeffery ThaGintoki 2017

3
私は彼らがクロームwebdriverでnavigator.webdriverを検出していると思います。intoli.com/blog/not-possible-to-block-chrome-headlessおよびstackoverflow.com/questions/47297877/…利用して、navigator.webdriver = falseにしようとしました。distilnetworks.com/distil_identify_cookie.htmlの
hoozecn

24

wellsfargo.comでの実装例:

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""

13
なぜ最後の試みは閉じられないのですか?他にあなたの答えを少し説明できますか?
ishandutta2007

16

JavaScriptの難読化結果

chromedriverのソースコードを確認しました。これにより、いくつかのJavaScriptファイルがブラウザに挿入されます。
このリンク上のすべてのJavaScriptファイルは、次のWebページに挿入されます: https : //chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

そこで、リバースエンジニアリングを使用し、16進編集によってjsファイルを難読化しました。これで、セレンの活動を明らかにするために、javascript変数、関数名、固定文字列が使用されていないことがわかりました。しかし、それでもいくつかのサイトとreCaptchaはセレンを検出します!
多分彼らはchromedriver js実行によって引き起こされる変更をチェックします:)


編集1:

Chromeの「ナビゲーター」パラメーターの変更

「ナビゲーター」に、chromedriverの使用を簡単に明らかにするいくつかのパラメーターがあることを発見しました。これらはパラメータです:

  • "navigator.webdriver"非自動化モードでは「未定義」です。自動モードでは「true」です。
  • "navigator.plugins"ヘッドレスクロムでは長さが0です。そこで、プラグインの長さチェックプロセスをだますために、いくつかの偽の要素を追加しました。
  • " navigator.languages"がデフォルトのクロム値 '["en-US"、 "en"、 "es"]'に設定されました。

だから私が必要としたのは、ウェブページでJavaScriptを実行するためのChrome拡張機能でした。記事で提供されているjsコードを使用して拡張機能を作成し、別の記事を使用して圧縮された拡張機能をプロジェクトに追加しました。値を正常に変更しました。しかし、まだ何も変わっていません!

私はこれらのような他の変数を見つけませんでしたが、それらが存在しないという意味ではありません。それでもreCaptchaはchromedriverを検出するので、変更する変数がもっとあるはずです。次のステップは、私はしたくないことを検出サービスのリバースエンジニアリングする必要があります。

今、私はこの自動化プロセスにより多くの時間を費やしたり、代替方法を検索したりする価値があるかどうかわかりません!


12

セレンをクロムの特定のユーザープロファイルで使用してみてください。そのようにして、特定のユーザーとして使用し、必要なものを定義できます。そうすることで、「実際の」ユーザーとして実行されます。いくつかのプロセスエクスプローラーでクロムプロセスを見て、タグとの違いがわかります。

例えば:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# add here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

ここにクロムタグリスト


11

partial interface Navigator { readonly attribute boolean webdriver; };

ナビゲーターインターフェースのwebdriver IDL属性は、webdriver-activeフラグの値を返す必要があります。これは最初はfalseです。

このプロパティにより、WebサイトはユーザーエージェントがWebDriverの制御下にあると判断でき、サービス拒否攻撃を緩和するために使用できます。

2017 W3C Editor's Draft of WebDriverから直接取得。これは、少なくとも、セレンのドライバーの将来の反復が誤用を防ぐために識別可能であることを強く示唆しています。結局のところ、ソースコードがないと、特定のChromeドライバーを正確に検出できる原因は正確にはわかりません。


4
「ソースコードなしではわかりにくい」..ソースコードは自由に利用できる
Corey Goldberg

6
問題のウェブサイトなしでソースコードを意味しました。彼らが何をチェックしているかを知るのは難しい。
ブライス2018年

8

Firefoxはwindow.navigator.webdriver === true、Webドライバーを使用する場合に設定すると言われています。それは古い仕様の1つ(例:archive.org)によるものでしたが、付録の非常にあいまいな表現を除いて、新しい仕様では見つけることができませんでした。

そのためのテストは、ファイル中のセレンのコードであるfingerprint_test.js最後のコメントは、「現在は、Firefoxで実装さ」と言うが、私はいくつかの単純なと、その方向に任意のコードを識別することができませんでしたgrep中にも、ING現在(41.0.2)FirefoxのリリースツリーまたはChromiumツリー。

また、2015年1月からのFirefoxドライバーb82512999938のフィンガープリントに関する古いコミットのコメントも見つかりました。そのコードはまだ昨日ダウンロードされたSelenium GITマスターにjavascript/firefox-driver/extension/content/server.jsあり、コメントは現在のw3c webdriver仕様のわずかに異なる言葉の付録にリンクしています。


2
Firefox 55でWebドライバーをテストしたところ、これが正しくないことを確認できました。変数window.navigator.webdriverが定義されていません。
スピードプレーン

1
更新:私はFirefox 65でテストしましたが、これは本当です:window.navigator.webdriver == true
speedplane

Firefoxバージョン76は、依然としてtrueであることを示しています
user2284144

8

@ Erti-Chris Eelmaaのすばらしい回答に加えて、煩わしくwindow.navigator.webdriverて読み取り専用です。イベントの値をそれに変更した場合でも、イベントfalseは残りますtrue。それが、自動化されたソフトウェアによって駆動されるブラウザーが依然として検出できる理由です。 MDN

変数は--enable-automation、クロムのフラグによって管理されます。chromedriverはそのフラグでchromeを起動し、chromeはをに設定window.navigator.webdrivertrueます。あなたはここでそれを見つけることができます。「スイッチを除外する」にはフラグを追加する必要があります。たとえば(golang):

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}

6

Webアプリケーションファイアウォールの背後にあるようです。modsecurityとowaspを見て、それらがどのように機能するかを確認してください。実際には、あなたが求めているのはボット検出回避をどのように行うかです。それはセレンWebドライバーの目的ではありません。これは、他のWebアプリケーションに影響を与えないようにWebアプリケーションをテストするためのものです。それは可能ですが、基本的には、WAFがルールセットで探しているものを確認し、可能であればセレンを使用してそれを明確に回避する必要があります。それでも、彼らが使用しているWAFがわからないため、機能しない可能性があります。あなたは正しい最初のステップを行いました、それはユーザーエージェントを偽造することです。それでもうまくいかない場合は、WAFが用意されており、さらに注意が必要です。

編集:他の回答から得られたポイント。最初にユーザーエージェントが実際に正しく設定されていることを確認してください。たぶんそれがローカルのウェブサーバーにヒットしたり、出て行くトラフィックを盗聴したりしているかもしれません。


あなたは正しい道を進んでいると思います。私は自分の設定でテストし、ユーザーエージェントを有効なユーザーエージェント文字列に置き換えましたが、成功し、同じ結果を受け取りました。スタブハブはリクエストをブロックしました。
ブライアンカイン

1
このトピックは非常に広範であり、理解しておらず、理解したい場合、ここは適切な場所ではありません。owaspから始めます。侵入テストとWebセキュリティを調べます。また、前に言ったように、このトピックについてはmodsecurityとWAFを調べてください。
Bassel Samman、2015年

1
それがHTTPヘッダーの問題だった場合、通常のブラウザーはブロックされませんか?HTTPヘッダーはまったく同じです。また、私はそのgithubリンクで正確に何を見ていますか?セレンを使ってスタブハブを試してみましたか?何かが非常にずれています。
Ryan Weinstein、2015年

1
混乱してごめんなさい。調査しますので、よろしければ、もう私を手伝う必要はありません。私の経験の大部分はシステムアプリケーションのプログラミングであるので、あなたが話しているこれらのmodsecurityルールに精通していませんでした。私は見て、自分自身を教育しようとします。私は何も迂回しようとしているのではなく、これらのWebサイトがセレンを使用しているユーザーをどのように検出するのか知りたいだけでした。
Ryan Weinstein

1
私も開発者です:)。学習は私が遅れをとることができる原因です。お役に立ててよかったのですが、私はあなたの意図がわからず、あなたが彼らのウェブサイトのセキュリティを迂回する手助けができなかったことを明確にしたかっただけです。しかし、あなたの質問に答えるために、彼らが検出しているのはセレンではありません。ルールは疑わしい動作を検出し、違反しているクライアントに対して適切な対策を講じることを決定しました。彼らはあなたが何をしていないのかというよりも、あなたがしていることによってあなたを捕まえます。リポジトリリンクで、このファイルをチェックアウトして、アイデアを取得できます。base_rules/ modsecurity_crs_20_protocol_violations.conf
Bassel Samman

6

すべての適切なデータを送信している場合でも(たとえば、Seleniumが拡張機能として表示されない、妥当な解像度/ビット深度、&cを持っている)、訪問者の行動をプロファイルして、アクターはユーザーまたは自動化システムです。

たとえば、サイトにアクセスしてすぐに関連するボタンにマウスを直接移動することで何らかのアクションを実行することは、ユーザーが実際に行うことはありません。

また、https://panopticlick.eff.org/などのサイトを使用して、ブラウザーの一意性を確認するデバッグツールとしても役立ちます。また、Seleniumで実行していることを示す特定のパラメーターがあるかどうかを確認するのにも役立ちます。


3
私はすでにそのWebサイトを使用しており、指紋は通常のブラウザと同じです。また、私は何も自動化していません。いつものように閲覧しています。
Ryan Weinstein、2015年

6

私が見たボット検出は、以下の回答で読んだボットの検出よりも洗練されているか、少なくとも異なります。

実験1:

  1. PythonコンソールからSeleniumでブラウザーとWebページを開きます。
  2. マウスは既に特定の場所にあり、ページが読み込まれるとリンクが表示されます。マウスを動かさない。
  3. マウスの左ボタンを1回押します(これは、Pythonが実行されているコンソールからブラウザーにフォーカスを移すために必要です)。
  4. もう一度マウスの左ボタンを押します(カーソルが所定のリンクの上にあることを思い出してください)。
  5. リンクは通常どおり開きます。

実験2:

  1. 以前と同じように、PythonコンソールからSeleniumを使用してブラウザーとWebページを開きます。

  2. 今回は、マウスでクリックする代わりに、(Pythonコンソールで)Seleniumを使用して、ランダムなオフセットで同じ要素をクリックします。

  3. リンクは開きませんが、サインアップページが表示されます。

含意:

  • Selenium経由でWebブラウザーを開いても、人間らしく見えるわけではありません
  • 人間のようにマウスを動かすことは、人間として分類される必要はありません
  • オフセットのあるSeleniumを介して何かをクリックしても、アラームが発生

不思議に思われるかもしれませんが、ブラウザ自体がSelenium経由で開かれたかどうかは気にしない一方で、アクションがSeleniumから発生したものかどうかを判断できるだけだと思います。または、ウィンドウにフォーカスがあるかどうかを判断できますか?誰かが何か洞察を持っているかどうか聞いて興味深いでしょう。


3
私の考えでは、Seleniumは要素を見つけてアクセスするためにJavaScriptを介してページに何かを注入します。この注射は、彼らが検出していると私が信じているものです。
zeusalmighty 2018年

あなたは正しい、このテストは100%有効です。私は同じ結果で同じようなテストを行いました。Enterタブまたはキーを送信できます。要素にアクセスした瞬間、ページは機能しなくなりました。したがって、ドライバがブラウザにJavaScriptを注入した場合。Chrome拡張機能を使用してそのJavaScriptを暗号化し、同じ拡張機能を使用して次のページで復号化できます。翌日見てみます。
トリクソ

6

私が見つけたもう1つのことは、一部のWebサイトがユーザーエージェントをチェックするプラットフォームを使用していることです。値に「HeadlessChrome」が含まれている場合、ヘッドレスモードを使用すると動作がおかしくなります。

そのための回避策は、たとえばJavaでユーザーエージェント値を上書きすることです。

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

5

一部のサイトはこれを検出しています:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}

これはChromeとFirefox、selenium 3.5.0、ChromeDriver 2.31.488774、geckodriver 0.18.0では機能しません
jerrypy

4

次のコードでHTMLページを記述します。DOMでは、seleniumがouterHTMLのwebdriver属性を適用することがわかります

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>


4
この属性はFirefoxでのみ追加されます。
Louis

1
また、ブラウザを制御するセレン拡張機能から削除することもできます。とにかく動作します。
m3nda 2017年

3

次のように、JavaScriptの「キー」変数を変更することがわかりました。

//Fools the website into believing a human is navigating it
        ((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

Selenium WebdriverをGoogle Chromeと一緒に使用すると、一部のWebサイトで機能します。これは、多くのサイトがSeleniumによって廃棄されないようにこの変数をチェックするためです。


2

Seleniumでこれを行う最も簡単な方法は、ブラウザーのフィンガープリントを送り返すXHRをインターセプトすることです。

しかし、これはSeleniumのみの問題であるため、他のものを使用することをお勧めします。Seleniumは、このようなことを簡単にするためのものであり、それほど難しくはありません。


セレンの他のオプションは何ですか?
Tai

私はリクエストがメインのPythonオプションになると思います。ブラウザが送信するものとまったく同じリクエストを送信すると、通常のブラウザとして表示されます。
pguardiario 2018

2

パラメータ「enable-automation」を使用してみることができます

var options = new ChromeOptions();

// hide selenium
options.AddExcludedArguments(new List<string>() { "enable-automation" });

var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options);

ただし、この機能はChromeDriver 79.0.3945.16で修正されたことを警告しますます。したがって、おそらく古いバージョンのChromeを使用する必要があります。

また、別のオプションとして、Chromeの代わりにInternetExplorerDriverを使用してみることもできます。私としては、IEはハッキングなしではまったくブロックしません。

詳細については、こちらをご覧ください。

Selenium webdriver:navigator.webdriverフラグを変更してセレン検出を防止

Chrome v76内で「Chromeは自動ソフトウェアによって制御されています」情報バーを非表示にできません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.