Kann eine Website erkennen, wann Sie Selen mit Chromedriver verwenden?

365

Ich habe Selenium mit Chromedriver getestet und festgestellt, dass einige Seiten erkennen können, dass Sie Selenium verwenden, obwohl es überhaupt keine Automatisierung gibt. Selbst wenn ich nur manuell mit Chrom über Selenium und Xephyr surfe, wird häufig eine Seite angezeigt, auf der verdächtige Aktivitäten festgestellt wurden. Ich habe meinen Benutzeragenten und meinen Browser-Fingerabdruck überprüft und sie sind alle genau identisch mit dem normalen Chrome-Browser.

Wenn ich in normalem Chrom zu diesen Websites navigiere, funktioniert alles einwandfrei, aber sobald ich Selenium verwende, werde ich erkannt.

Theoretisch sollten Chromedriver und Chrome für jeden Webserver buchstäblich genau gleich aussehen, aber irgendwie können sie es erkennen.

Wenn Sie einen Testcode wünschen, probieren Sie Folgendes aus:

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')

Wenn Sie sich in stubhub umsehen, werden Sie innerhalb von ein oder zwei Anfragen umgeleitet und "blockiert". Ich habe dies untersucht und kann nicht herausfinden, wie sie feststellen können, dass ein Benutzer Selen verwendet.

Wie machen Sie das?

UPDATE BEARBEITEN:

Ich habe das Selenium IDE-Plugin in Firefox installiert und wurde gesperrt, als ich im normalen Firefox-Browser mit nur dem zusätzlichen Plugin zu stubhub.com ging.

BEARBEITEN:

Wenn ich Fiddler verwende, um die hin und her gesendeten HTTP-Anforderungen anzuzeigen, ist mir aufgefallen, dass die Anforderungen der gefälschten Browser häufig den Antwort-Header "no-cache" enthalten.

BEARBEITEN:

Ergebnisse wie dieses Gibt es eine Möglichkeit zu erkennen, dass ich mich auf einer Selenium Webdriver-Seite von Javascript befinde? Es gibt keine Möglichkeit zu erkennen, wann Sie einen Webdriver verwenden. Aber diese Beweise deuten auf etwas anderes hin.

BEARBEITEN:

Die Site lädt einen Fingerabdruck auf ihre Server hoch, aber ich habe überprüft, ob der Fingerabdruck von Selen mit dem Fingerabdruck bei Verwendung von Chrom identisch ist.

BEARBEITEN:

Dies ist eine der Fingerabdruck-Nutzdaten, die sie an ihre Server senden

{"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"}}

Es ist identisch in Selen und in Chrom

BEARBEITEN:

VPNs funktionieren nur einmal, werden jedoch erkannt, nachdem ich die erste Seite geladen habe. Offensichtlich wird etwas Javascript ausgeführt, um Selen zu erkennen.

Ryan Weinstein
quelle
4
@ RyanWeinstein: Es ist kein Verkehr. Ich vermute, dass Selenium einige JavaScript-Hooks verfügbar machen muss, die auf dem clientseitigen JavaScript erkannt werden können.
Mikko Ohtamaa
5
Oder wenn es Verkehr ist, dann ist es ein Verkehrsmuster ... Sie durchsuchen Seiten zu schnell.
Mikko Ohtamaa
6
Ich surfe nicht zu schnell. Ich lade nur eine Seite und navigiere normal mit Maus und Tastatur durch die Seite. Es macht auch keinen Sinn, dass Selen Hooks freilegen muss, da es buchstäblich chrome.exe ausführt. Es läuft nur normales Chrom und ermöglicht es Ihnen, Daten von ihm zu erhalten. Irgendwelche anderen Ideen? Ich dachte, vielleicht hat es etwas mit Cookies zu tun. Das macht mich verrückt.
Ryan Weinstein
5
Diese Seite nutzt distillErkennungstechnologie bietet und liefert Inhalte mit akamaitechnologies.comCDN von diffrent ips zB 95.100.59.245, 104.70.243.66,23.202.161.241
SIslam
5
Ich habe das gleiche Problem mit Selenium und dem Firefox-Treiber. Das Interessante ist, dass ich Selenium in einer virtuellen VMWare Workstation-Maschine ausführe, die über NAT auf das Internet zugreift. Der Host-Computer kann auf Stubhub zugreifen, während die VM bei Verwendung von Selenium oder sogar auf die gestartete Browser-Instanz Selenium nicht zugreifen kann. Ich hatte die VM-Browser-Instanz blockiert und stubhub erkennt den Computer immer noch und hat ihn blockiert. Es muss also in irgendeiner Weise ein Fingerabdruck des Browsers und des Computers erstellt werden.
Brian Cain

Antworten:

51

Für Mac-Benutzer

cdc_Variable durch Vim oder Perl ersetzen

Sie können vimoder, wie @Vic Seedoubleyew in der Antwort von @ Erti-Chris Eelmaa ausgeführt hat perl, die cdc_Variable in ersetzen chromedriver( siehe Beitrag von @ Erti-Chris Eelmaa, um mehr über diese Variable zu erfahren ). Verwenden vimoder perlverhindert, dass Sie den Quellcode neu kompilieren oder einen Hex-Editor verwenden müssen. Stellen Sie sicher, dass Sie eine Kopie des Originals chromedrivererstellen, bevor Sie versuchen, es zu bearbeiten. Auch die folgenden Methoden wurden getestet chromedriver version 2.41.578706.


Verwenden von Vim

vim /path/to/chromedriver

Nachdem Sie die obige Zeile durchlaufen haben, werden Sie wahrscheinlich einen Haufen Kauderwelsch sehen. Mach Folgendes:

  1. Suchen Sie cdc_durch Tippen /cdc_und Drücken return.
  2. Aktivieren Sie die Bearbeitung durch Drücken von a.
  3. Löschen Sie eine beliebige Anzahl von $cdc_lasutopfhvcZLmcflund ersetzen Sie das Gelöschte durch eine gleiche Anzahl von Zeichen. Wenn Sie dies nicht tun, chromedriverwird dies fehlschlagen.
  4. Nachdem Sie die Bearbeitung abgeschlossen haben, drücken Sie esc.
  5. Geben Sie ein :wq!und drücken Sie, um die Änderungen zu speichern und zu beenden return.
  6. Wenn Sie die Änderungen nicht speichern möchten, aber beenden möchten, geben Sie ein :q!und drücken Sie return.
  7. Du bist fertig.

Gehen Sie zu den geänderten chromedriverund doppelklicken Sie darauf. Ein terminalFenster sollte sich öffnen. Wenn Sie killedin der Ausgabe nichts sehen , haben Sie den Treiber erfolgreich geändert.


Verwenden von Perl

Die folgende Zeile ersetzt cdc_durch dog_:

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

Stellen Sie sicher, dass die Ersatzzeichenfolge dieselbe Anzahl von Zeichen wie die Suchzeichenfolge enthält, da sonst die Zeichenfolge chromedriverfehlschlägt.

Perl Erklärung

s///g bedeutet, dass Sie nach einer Zeichenfolge suchen und diese global durch eine andere Zeichenfolge ersetzen möchten (ersetzt alle Vorkommen).

z.B, s/string/replacment/g

Damit,

s/// bezeichnet das Suchen und Ersetzen einer Zeichenfolge.

cdc_ ist die Suchzeichenfolge.

dog_ ist die Ersatzzeichenfolge.

g ist der globale Schlüssel, der jedes Vorkommen der Zeichenfolge ersetzt.

So überprüfen Sie, ob der Perl-Ersatz funktioniert hat

In der folgenden Zeile wird jedes Vorkommen der Suchzeichenfolge gedruckt cdc_:

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

Wenn dies nichts zurückgibt, cdc_wurde es ersetzt.

Umgekehrt können Sie Folgendes verwenden:

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

um zu sehen, ob Ihre Ersatzzeichenfolge dog_jetzt in der chromedriverBinärdatei ist. Wenn dies der Fall ist, wird die Ersatzzeichenfolge auf der Konsole gedruckt.

Gehen Sie zu den geänderten chromedriverund doppelklicken Sie darauf. Ein terminalFenster sollte sich öffnen. Wenn Sie killedin der Ausgabe nichts sehen , haben Sie den Treiber erfolgreich geändert.


Einpacken

Stellen Sie nach dem Ändern der chromedriverBinärdatei sicher, dass der Name der geänderten chromedriverBinärdatei lautet chromedriverund dass die ursprüngliche Binärdatei entweder von ihrem ursprünglichen Speicherort verschoben oder umbenannt wurde.


Meine Erfahrung mit dieser Methode

Ich wurde zuvor auf einer Website erkannt, als ich versuchte cdc_, mich anzumelden, aber nachdem ich sie durch eine gleich große Zeichenfolge ersetzt hatte, konnte ich mich anmelden. Wie andere bereits gesagt haben, werden Sie möglicherweise für a blockiert, wenn Sie bereits erkannt wurden Eine Vielzahl anderer Gründe, auch nach Anwendung dieser Methode. Daher müssen Sie möglicherweise versuchen, über ein VPN, ein anderes Netzwerk oder was Sie haben, auf die Site zuzugreifen, auf der Sie erkannt wurden.

colossatr0n
quelle
@LekaBaper Danke für das Heads Up. Die von mir verwendete Chromedriver-Version war Version 2.41.578706.
Colossatr0n
2
Hat nicht funktioniert, auch wenn ich diese Änderung von chromedriver.exe auf einem neuen physischen Computer in einem anderen Netzwerk verwendet habe.
Ahmed Memon
Es gibt einen Fehler, der besagt, dass diese Version auf diesem Computer nicht funktionieren kann :(
Walid Bousseta
@ colossatr0n Gibt es eine nicht nachweisbare Open-Source-Gabel, die Ihnen bekannt ist?
ishandutta2007
3
Beachten Sie, dass die Leute von chromedriver erklärt haben, dass dieses Problem nicht behoben werden kann. Sie können also davon ausgehen, dass Sie auf unbestimmte Zeit eine Gabel verwenden oder die Binärdatei bearbeiten müssen. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiologist
144

Grundsätzlich funktioniert die Selenerkennung so, dass sie auf vordefinierte Javascript-Variablen testen, die beim Ausführen mit Selen auftreten. Die Bot-Erkennungsskripte sehen normalerweise alles aus, was das Wort "Selen" / "Webdriver" in einer der Variablen (auf dem Fensterobjekt) enthält, und dokumentieren auch Variablen mit dem Namen $cdc_und $wdc_. All dies hängt natürlich davon ab, in welchem ​​Browser Sie sich befinden. All die verschiedenen Browser zeigen verschiedene Dinge.

Für mich habe ich Chrome verwendet. Alles, was ich tun musste, war sicherzustellen, dass $cdc_es nicht mehr als Dokumentvariable existiert, und voila (Chromedriver-Quellcode herunterladen, Chromedriver ändern und $cdc_unter einem anderen Namen neu kompilieren .)

Dies ist die Funktion, die ich in chromedriver geändert habe:

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];
}

(Beachten Sie den Kommentar, alles, was ich getan habe, an das ich mich gewandt $cdc_habe randomblabla_.

Hier ist ein Pseudocode, der einige der Techniken demonstriert, die Bot-Netzwerke verwenden könnten:

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;
};

Laut Benutzer @szx ist es auch möglich, chromedriver.exe einfach im Hex-Editor zu öffnen und den Austausch einfach manuell durchzuführen, ohne tatsächlich zu kompilieren.

Erti-Chris Eelmaa
quelle
26
Ja, es hat ohne Probleme funktioniert. Beachten Sie, dass es ein Problem ist, wenn Sie vor dieser Änderung auf die "schwarze Liste" fallen. Es ist ziemlich schwierig, herauszukommen. Wenn Sie aus der vorhandenen schwarzen Liste herauskommen möchten, müssen Sie gefälschte Fingerabdrücke auf der Leinwand implementieren, Flash deaktivieren, IP ändern und die Reihenfolge der Anforderungsheader ändern (Sprache austauschen und Header akzeptieren). Sobald Sie auf die schwarze Liste gefallen sind, haben sie sehr gute Maßnahmen, um Sie zu verfolgen, selbst wenn Sie die IP ändern, selbst wenn Sie Chrom inkognito öffnen usw.
Erti-Chris Eelmaa
2
Ich fand die Datei "/ Users / your_username / chrom / src / chrome / test / chromedriver / js"
JonghoKim
7
Ich ersetzen einfach $cdcmit xxxxin chromedriver.exein einem Hex - Editor und es funktionierte! Ich habe auch festgestellt, dass das Browserfenster weniger häufig erkannt wird, wenn Sie es maximieren (anstatt eine vordefinierte Größe zu verwenden).
Szx
2
war das unter Windows, OSX oder Linux? Die Hex-Bearbeitung unter osx scheint nicht zu funktionieren.
Nish
5
hexadezimal bearbeitet mit $ zzz_zzzzzzzzzzzzzzzzzzzz_ (gleiche Anzahl von Zeichen), hat aber nicht funktioniert.
Aymon Fournier
100

Wie wir bereits in der Frage und den veröffentlichten Antworten herausgefunden haben, gibt es hier einen Anti-Web-Scraping- und einen Bot-Erkennungsdienst namens "Distil Networks" . Und laut dem Interview des CEO des Unternehmens :

Obwohl sie neue Bots erstellen können, haben wir einen Weg gefunden, um Selen als das von ihnen verwendete Tool zu identifizieren. Daher blockieren wir Selen, unabhängig davon, wie oft sie auf diesem Bot iterieren . Wir machen das jetzt mit Python und vielen verschiedenen Technologien. Sobald wir sehen, dass ein Muster aus einem Bot-Typ hervorgeht, arbeiten wir daran, die von ihnen verwendete Technologie zurückzuentwickeln und als bösartig zu identifizieren.

Es wird einige Zeit und zusätzliche Herausforderungen erfordern, um zu verstehen, wie genau sie Selen nachweisen, aber was können wir im Moment mit Sicherheit sagen:

  • Es hängt nicht mit den Aktionen zusammen, die Sie mit Selen ausführen. Sobald Sie zur Website navigieren, werden Sie sofort erkannt und gesperrt. Ich habe versucht, künstliche zufällige Verzögerungen zwischen Aktionen hinzuzufügen und nach dem Laden der Seite eine Pause einzulegen - nichts hat geholfen
  • Es geht auch nicht um Browser-Fingerabdrücke - habe es in mehreren Browsern mit sauberen Profilen und nicht im Inkognito-Modus versucht - nichts hat geholfen
  • Da es sich laut dem Hinweis im Interview um "Reverse Engineering" handelte, wird dies vermutlich mit JS-Code im Browser ausgeführt, der zeigt, dass es sich um einen über Selen-Webdriver automatisierten Browser handelt

Beschlossen, es als Antwort zu posten, da klar:

Kann eine Website erkennen, wann Sie Selen mit Chromedriver verwenden?

Ja.


Ich habe auch nicht mit älteren Selen- und älteren Browserversionen experimentiert - theoretisch könnte an einem bestimmten Punkt, auf den sich der Bot-Detektor von Distil Networks derzeit stützt, etwas implementiert / zu Selen hinzugefügt werden. Wenn dies der Fall ist, können wir dann erkennen (ja, lassen Sie uns den Detektor erkennen), an welchem ​​Punkt / in welcher Version eine relevante Änderung vorgenommen wurde, das Änderungsprotokoll und die Änderungssätze untersuchen und möglicherweise weitere Informationen darüber erhalten, wo wir suchen müssen und was verwenden sie, um einen Browser mit Webdriver zu erkennen? Es ist nur eine Theorie, die getestet werden muss.

Alecxe
quelle
@ RyanWeinstein gut, wir haben keinen tatsächlichen Beweis und wir können nur spekulieren und testen. Im Moment würde ich sagen, dass sie eine Möglichkeit haben, uns mit Selen zu erkennen. Versuchen Sie, mit Selenversionen zu experimentieren - dies kann Ihnen einige Hinweise geben.
Alecxe
1
Könnte es damit zu tun haben, wie kurzlebige Ports bestimmt werden? Die Methode hält sich von bekannten Bereichen fern. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay
9
Easyjet verwendet den Distilnetwork-Dienst. Ja, er kann Dummy-Bots blockieren, aber nicht die komplizierten, da wir ihn mit mehr als 2000 Anfragen pro Tag von verschiedenen IPs getestet haben (die wir wieder mit derselben Adresse wiederverwenden) 5-10 Anfragen pro Tag und daraus kann ich erkennen, dass all diese Bot-Erkennungsdienste nur dazu da sind, etwa 45% funktionierende Algorithmen zu entwickeln und zu verkaufen. Der von uns verwendete Scrapper war leicht zu erkennen. Ich kann ihn blockieren, während Destilnetworks, Squareshield und andere konnte mich nicht dazu bringen, keinen von ihnen zu benutzen.
Jeffery ThaGintoki
3
Ich denke, sie erkennen navigator.webdriver in Chrome Webdriver. Ich habe versucht, navigator.webdriver = false mit Hilfe von intoli.com/blog/not-possible-to-block-chrome-headless und stackoverflow.com/questions/47297877/… zu machen . Es gibt eine Bot-Erkennungsseite anstelle von distilnetworks.com/distil_identify_cookie.html zurück
hoozecn
24

Beispiel für die Implementierung auf 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 !+""
aianitro
quelle
13
Warum ist der letzte Versuch nicht abgeschlossen? Außerdem kannst du deine Antwort ein wenig erklären.
ishandutta2007
16

Verschleiertes JavaScripts-Ergebnis

Ich habe den Chromedriver-Quellcode überprüft. Dadurch werden einige Javascript-Dateien in den Browser eingefügt.
Jede Javascript-Datei unter diesem Link wird auf die folgenden Webseiten eingefügt: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Also habe ich Reverse Engineering verwendet und die js-Dateien durch Hex-Bearbeitung verschleiert . Jetzt war ich mir sicher, dass keine Javascript-Variablen, Funktionsnamen und festen Zeichenfolgen mehr verwendet wurden, um die Selenaktivität aufzudecken. Trotzdem erkennen einige Standorte und reCaptcha Selen!
Vielleicht überprüfen sie die Änderungen, die durch die Ausführung von chromedriver js verursacht werden :)


Bearbeiten 1:

Änderung der Chrome-Navigatorparameter

Ich habe festgestellt, dass es in 'navigator' einige Parameter gibt, die die Verwendung von chromedriver kurz aufdecken. Dies sind die Parameter:

  • "navigator.webdriver" Im nicht automatisierten Modus ist es "undefiniert". Im automatisierten Modus ist es "wahr".
  • "navigator.plugins" Auf kopflosem Chrom hat 0 Länge. Also habe ich einige gefälschte Elemente hinzugefügt, um den Prozess der Überprüfung der Plugin-Länge zu täuschen.
  • " navigator.languages" wurde auf den Standard-Chrome-Wert "[" en-US "," en "," es "]" gesetzt.

Was ich also brauchte, war eine Chrome-Erweiterung, um Javascript auf den Webseiten auszuführen. Ich habe eine Erweiterung mit dem im Artikel angegebenen js-Code erstellt und einen anderen Artikel verwendet , um die komprimierte Erweiterung zu meinem Projekt hinzuzufügen. Ich habe die Werte erfolgreich geändert. Trotzdem hat sich nichts geändert!

Ich habe keine anderen Variablen wie diese gefunden, aber das bedeutet nicht, dass sie nicht existieren. Trotzdem erkennt reCaptcha den Chromedriver. Es sollten also mehr Variablen geändert werden. Der nächste Schritt sollte das Reverse Engineering der Detektordienste sein, die ich nicht machen möchte.

Jetzt bin ich mir nicht sicher, ob es sich lohnt, mehr Zeit für diesen Automatisierungsprozess aufzuwenden oder nach alternativen Methoden zu suchen!

ShayanKM
quelle
12

Versuchen Sie, Selen mit einem bestimmten Benutzerprofil von Chrome zu verwenden. Auf diese Weise können Sie es als bestimmten Benutzer verwenden und alles definieren, was Sie möchten. Wenn dies als "echter" Benutzer ausgeführt wird, sehen Sie sich den Chrome-Prozess mit einem Prozess-Explorer an und Sie werden den Unterschied mit den Tags sehen.

Zum Beispiel:

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)

Chrom-Tag-Liste hier

Kobi K.
quelle
11

partial interface Navigator { readonly attribute boolean webdriver; };

Das Webdriver-IDL-Attribut der Navigator-Schnittstelle muss den Wert des Webdriver-Active-Flags zurückgeben, der anfangs falsch ist.

Mit dieser Eigenschaft können Websites feststellen, ob der Benutzeragent von WebDriver kontrolliert wird, und können verwendet werden, um Denial-of-Service-Angriffe zu verringern.

Entnommen direkt aus dem Entwurf des W3C-Editors von WebDriver 2017 . Dies impliziert stark, dass zumindest zukünftige Iterationen der Selentreiber identifizierbar sind, um Missbrauch zu verhindern. Letztendlich ist es ohne den Quellcode schwer zu sagen, was genau dazu führt, dass der Chrome-Treiber spezifisch erkennbar ist.

Bryce
quelle
4
"Ohne den Quellcode ist es schwer zu sagen". Nun, der Quellcode ist frei verfügbar
Corey Goldberg
6
Ich meinte ohne den Quellcode der fraglichen Website. Es ist schwer zu sagen, gegen was sie prüfen.
Bryce
8

Firefox soll eingestellt werden, window.navigator.webdriver === truewenn mit einem Web-Treiber gearbeitet wird. Das entsprach einer der älteren Spezifikationen (z. B. archive.org ), aber ich konnte es in der neuen nicht finden, abgesehen von einigen sehr vagen Formulierungen in den Anhängen.

Ein Test dafür befindet sich im Selen-Code in der Datei fingerprint_test.js, wo der Kommentar am Ende lautet "Derzeit nur in Firefox implementiert", aber ich konnte keinen Code in dieser Richtung mit etwas Einfachem identifizieren grep, auch nicht in der aktueller (41.0.2) Firefox Release-Baum noch im Chromium-Baum.

Ich habe auch einen Kommentar für ein älteres Commit bezüglich Fingerabdruck im Firefox-Treiber b82512999938 vom Januar 2015 gefunden . Dieser Code befindet sich noch im Selenium GIT-Master, der gestern unter heruntergeladen wurde, javascript/firefox-driver/extension/content/server.jsmit einem Kommentar, der auf den etwas anders formulierten Anhang in der aktuellen w3c-Webdriver-Spezifikation verweist.

deamentiaemundi
quelle
2
Ich habe gerade den Webdriver mit Firefox 55 getestet und kann bestätigen, dass dies nicht der Fall ist. Die Variable window.navigator.webdriverist nicht definiert.
Speedplane
1
Update: Ich habe mit Firefox 65 getestet, und das ist wahr:window.navigator.webdriver == true
Speedplane
Firefox Version 76 zeigt immer noch, dass es wahr ist
user2284144
8

Zusätzlich zu der großartigen Antwort von @ Erti-Chris Eelmaa - es ist ärgerlich window.navigator.webdriverund es ist schreibgeschützt. Ereignis, wenn Sie den Wert ändern, wird falsees weiterhin haben true. Deshalb kann der von automatisierter Software gesteuerte Browser immer noch erkannt werden. MDN

Die Variable wird vom Flag --enable-automationin Chrome verwaltet. Der Chromedriver startet Chrome mit dieser Flagge und Chrome setzt das window.navigator.webdriverauf true. Sie finden es hier . Sie müssen das Flag hinzufügen, um "Schalter ausschließen". Zum Beispiel (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))
}
FDG
quelle
6

Es hört sich so an, als stünden sie hinter einer Webanwendungs-Firewall. Schauen Sie sich modsecurity und owasp an, um zu sehen, wie diese funktionieren. In Wirklichkeit fragen Sie, wie Sie die Bot-Erkennung umgehen können. Dafür ist der Selenium-Webtreiber nicht gedacht. Es dient zum Testen Ihrer Webanwendung, ohne andere Webanwendungen zu treffen. Es ist möglich, aber im Grunde müsste man sich ansehen, wonach eine WAF in ihrem Regelsatz sucht, und es mit Selen vermeiden, wenn man kann. Selbst dann funktioniert es möglicherweise immer noch nicht, da Sie nicht wissen, welche WAF sie verwenden. Sie haben den richtigen ersten Schritt getan, nämlich den Benutzeragenten zu fälschen. Wenn das aber nicht funktioniert hat, ist ein WAF vorhanden und Sie müssen wahrscheinlich kniffliger werden.

Bearbeiten: Punkt aus anderer Antwort genommen. Stellen Sie sicher, dass Ihr Benutzeragent zuerst richtig eingestellt ist. Vielleicht hat es einen lokalen Webserver getroffen oder den Datenverkehr aufgespürt.

Bassel Samman
quelle
Ich denke du bist auf dem richtigen Weg. Ich habe mit meinem Setup getestet und den Benutzeragenten durch eine gültige Benutzeragentenzeichenfolge ersetzt, die erfolgreich durchlaufen wurde und dasselbe Ergebnis erhalten hat. Stubhub hat die Anforderung blockiert.
Brian Cain
1
Dieses Thema ist sehr umfangreich, ich würde sagen, wenn Sie es nicht verstehen und es verstehen wollen, ist hier nicht der richtige Ort. Beginnen Sie mit Owasp. Informieren Sie sich über Penetrationstests und Websicherheit. Schauen Sie sich, wie ich bereits sagte, Modsecurity und WAF für speziell dieses Thema an.
Bassel Samman
1
Wenn es sich um ein HTTP-Header-Problem handelt, wird der normale Browser dann nicht blockiert? Die HTTP-Header sind genau gleich. Und was genau schaue ich mit diesem Github-Link? Haben Sie versucht, Selen für Stubhub zu verwenden? Etwas ist sehr sehr falsch.
Ryan Weinstein
1
Die Verwirrung tut mir leid. Ich werde das untersuchen und du musst mir nicht mehr helfen, wenn du nicht willst. Der größte Teil meiner Erfahrung liegt in der Programmierung von Systemanwendungen, daher war ich mit diesen Modsecurity-Regeln, über die Sie sprechen, nicht vertraut. Ich werde einen Blick darauf werfen und versuchen, mich weiterzubilden. Ich versuche nichts zu umgehen, ich war nur daran interessiert zu wissen, wie diese Websites einen Benutzer erkennen, der Selen verwendet.
Ryan Weinstein
1
Ich bin auch ein Entwickler :). Lernen ist eine Sache, die ich hinter mich bringen kann. Es macht mir nichts aus zu helfen, ich wollte nur klarstellen, dass ich Ihre Absichten nicht kannte und Ihnen nicht genau helfen konnte, die Sicherheit ihrer Website zu umgehen. Um Ihre Frage zu beantworten, erkennen sie kein Selen. Die Regeln erkannten verdächtiges Verhalten und beschlossen, die entsprechenden Maßnahmen gegen den beleidigenden Kunden zu ergreifen. Sie fangen dich an dem, was du nicht mehr tust als an dem, was du tust. Im Repo-Link können Sie diese Datei auschecken, um eine Idee zu erhalten. Base_rules / modsecurity_crs_20_protocol_violations.conf
Bassel Samman
6

Selbst wenn Sie alle richtigen Daten senden (z. B. Selen wird nicht als Erweiterung angezeigt, Sie haben eine angemessene Auflösung / Bittiefe usw.), gibt es eine Reihe von Diensten und Tools, die das Besucherverhalten profilieren, um festzustellen, ob die Akteur ist ein Benutzer oder ein automatisiertes System.

Wenn Sie beispielsweise eine Site besuchen und dann sofort eine Aktion ausführen, indem Sie die Maus in weniger als einer Sekunde direkt auf die entsprechende Schaltfläche bewegen, würde dies kein Benutzer tatsächlich tun.

Es kann auch als Debugging-Tool nützlich sein, eine Website wie https://panopticlick.eff.org/ zu verwenden, um zu überprüfen, wie einzigartig Ihr Browser ist. Außerdem können Sie überprüfen, ob bestimmte Parameter vorhanden sind, die darauf hinweisen, dass Sie in Selenium ausgeführt werden.

lfaraone
quelle
3
Ich habe diese Website bereits verwendet und der Fingerabdruck ist identisch mit meinem normalen Browser. Außerdem automatisiere ich nichts. Ich surfe nur wie gewohnt.
Ryan Weinstein
6

Die Bot-Erkennung, die ich gesehen habe, scheint ausgefeilter oder zumindest anders zu sein als das, was ich in den Antworten unten gelesen habe.

Versuch 1:

  1. Ich öffne einen Browser und eine Webseite mit Selenium über eine Python-Konsole.
  2. Die Maus befindet sich bereits an einer bestimmten Stelle, an der nach dem Laden der Seite ein Link angezeigt wird. Ich bewege nie die Maus.
  3. Ich drücke einmal die linke Maustaste (dies ist notwendig, um den Fokus von der Konsole, auf der Python ausgeführt wird, auf den Browser zu lenken).
  4. Ich drücke erneut die linke Maustaste (denken Sie daran, der Cursor befindet sich über einem bestimmten Link).
  5. Der Link wird normal geöffnet, wie es sollte.

Versuch 2:

  1. Nach wie vor öffne ich einen Browser und die Webseite mit Selenium über eine Python-Konsole.

  2. Dieses Mal verwende ich Selenium (in der Python-Konsole), anstatt mit der Maus zu klicken, um auf dasselbe Element mit einem zufälligen Versatz zu klicken.

  3. Der Link wird nicht geöffnet, aber ich werde zu einer Anmeldeseite weitergeleitet.

AUSWIRKUNGEN:

  • Das Öffnen eines Webbrowsers über Selenium hindert mich nicht daran, menschlich zu wirken
  • Das Bewegen der Maus wie ein Mensch ist nicht erforderlich, um als Mensch eingestuft zu werden
  • Wenn Sie über Selen mit einem Versatz auf etwas klicken, wird der Alarm weiterhin ausgelöst

Scheint mysteriös, aber ich denke, sie können nur feststellen, ob eine Aktion von Selen stammt oder nicht, während es ihnen egal ist, ob der Browser selbst über Selen geöffnet wurde oder nicht. Oder können sie feststellen, ob das Fenster scharfgestellt ist? Es wäre interessant zu hören, wenn jemand irgendwelche Einsichten hat.

M3RS
quelle
3
Ich glaube, dass Selenium etwas über Javascript in die Seite einfügt, um Elemente zu finden und darauf zuzugreifen. Ich glaube, diese Injektion wird von ihnen entdeckt.
zeusalmighty
Sie haben Recht, dieser Test ist 100% gültig. Ich hatte einen ähnlichen Test mit den gleichen Ergebnissen durchgeführt. Ich könnte die Registerkarte Eingabe oder Schlüssel senden. Sobald ich auf Elemente zugreife, funktioniert die Seite nicht mehr. Also, wenn der Treiber etwas Javascript in den Browser einfügt. Wir könnten dieses Javascript einfach mit der Chrome-Erweiterung verschlüsseln und auf der nächsten Seite mit derselben Erweiterung entschlüsseln. Ich werde versuchen, es mir in den nächsten Tagen anzusehen.
Trixo
6

Eine weitere Sache, die ich gefunden habe, ist, dass einige Websites eine Plattform verwenden, die den User Agent überprüft. Wenn der Wert Folgendes enthält: "HeadlessChrome", kann das Verhalten im Headless-Modus seltsam sein.

Die Problemumgehung besteht darin, den Benutzeragentenwert zu überschreiben, beispielsweise in 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");
Adi Ohana
quelle
5

Einige Websites erkennen dies:

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) {}
Néstor
quelle
Dies funktioniert nicht für Chrome und Firefox, Selen 3.5.0, ChromeDriver 2.31.488774, Geckodriver 0.18.0
Jerryy
4

Schreiben Sie eine HTML-Seite mit dem folgenden Code. Sie werden sehen, dass im DOM-Selen ein Webdriver-Attribut in der OuterHTML angewendet wird

<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>

PC3TJ
quelle
4
Das Attribut wird nur in Firefox hinzugefügt.
Louis
1
Und es ist möglich, es aus der Selen-Erweiterung zu entfernen, die den Browser steuert. Es wird sowieso funktionieren.
m3nda
3

Ich habe festgestellt, dass die Javascript-Variable "key" folgendermaßen geändert wird:

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

funktioniert für einige Websites, wenn Selenium Webdriver zusammen mit Google Chrome verwendet wird, da viele Websites nach dieser Variablen suchen, um zu vermeiden, dass sie von Selenium verschrottet werden.

Juliagu
quelle
2

Es scheint mir, dass der einfachste Weg, dies mit Selen zu tun, darin besteht, das XHR abzufangen, das den Fingerabdruck des Browsers zurücksendet.

Da es sich jedoch nur um ein Selen-Problem handelt, ist es besser, nur etwas anderes zu verwenden. Selen soll solche Dinge einfacher machen, nicht viel schwieriger.

pguardiario
quelle
Was sind andere Optionen für Selen?
Tai
Ich denke, Anfragen wären die Haupt-Python-Option. Wenn Sie genau dieselben Anforderungen senden, die Ihr Browser sendet, werden Sie als normaler Browser angezeigt.
pguardiario
2

Sie können versuchen, den Parameter "enable-automation" zu verwenden.

var options = new ChromeOptions();

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

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

Ich möchte jedoch warnen, dass diese Funktion in ChromeDriver 79.0.3945.16 behoben wurde . Daher sollten Sie wahrscheinlich ältere Chromversionen verwenden.

Als weitere Option können Sie auch versuchen, InternetExplorerDriver anstelle von Chrome zu verwenden. Was mich betrifft, blockiert IE überhaupt nicht ohne Hacks.

Und für weitere Informationen versuchen Sie es hier:

Selenium-Webdriver: Ändern des navigator.webdriver-Flags, um die Selenerkennung zu verhindern

Die Infobar "Chrome wird von automatisierter Software gesteuert" in Chrome v76 kann nicht ausgeblendet werden

Sergiy Matvienko
quelle