Un sito Web è in grado di rilevare quando si utilizza selenio con chromedriver?


365

Ho testato Selenium con Chromedriver e ho notato che alcune pagine sono in grado di rilevare che stai utilizzando Selenium anche se non c'è alcuna automazione. Anche quando sto solo navigando manualmente usando Chrome tramite Selenium e Xephyr ricevo spesso una pagina che dice che è stata rilevata un'attività sospetta. Ho controllato il mio agente utente e la mia impronta digitale del browser e sono tutti esattamente identici al normale browser Chrome.

Quando navigo su questi siti in Chrome normale, tutto funziona bene, ma nel momento in cui utilizzo il selenio mi viene rilevato.

In teoria, chromedriver e Chrome dovrebbero apparire esattamente identici per qualsiasi server web, ma in qualche modo possono rilevarlo.

Se vuoi un testcode prova questo:

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

Se navighi in stubhub verrai reindirizzato e "bloccato" all'interno di una o due richieste. Ho studiato questo e non riesco a capire come possano dire che un utente sta usando il selenio.

Come lo fanno?

MODIFICA AGGIORNAMENTO:

Ho installato il plug-in IDE di Selenium in Firefox e sono stato bannato quando sono andato su stubhub.com nel normale browser Firefox con solo il plug-in aggiuntivo.

MODIFICARE:

Quando uso Fiddler per visualizzare le richieste HTTP inviate avanti e indietro, ho notato che le richieste di "browser falsi" spesso hanno "no-cache" nell'intestazione della risposta.

MODIFICARE:

risultati come questo Esiste un modo per rilevare che mi trovo in una pagina Selenium Webdriver da Javascript suggerisce che non dovrebbe esserci alcun modo per rilevare quando si utilizza un webdriver. Ma questa prova suggerisce il contrario.

MODIFICARE:

Il sito carica un'impronta digitale sui loro server, ma ho controllato e l'impronta digitale del selenio è identica all'impronta digitale quando si utilizza Chrome.

MODIFICARE:

Questo è uno dei payload delle impronte digitali che inviano ai loro server

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

È identico in selenio e in cromo

MODIFICARE:

Le VPN funzionano per un singolo utilizzo ma vengono rilevate dopo aver caricato la prima pagina. Chiaramente alcuni javascript sono in esecuzione per rilevare il selenio.


4
@RyanWeinstein: non è traffico. La mia ipotesi è che Selenium debba esporre alcuni hook JavaScript che possono essere rilevati sul JavaScript lato client.
Mikko Ohtamaa,

5
O se si tratta di traffico, allora è un modello di traffico .... stai navigando le pagine troppo velocemente.
Mikko Ohtamaa,

6
Non sto navigando troppo in fretta. Carico solo una singola pagina e la navigo normalmente usando il mouse e la tastiera. Inoltre, non ha senso che Selenium debba esporre gli hook, perché ha letteralmente Chrome.exe in esecuzione. Funziona semplicemente con Chrome normale e ti consente di ottenere dati da esso. Altre idee? Stavo pensando che forse ha qualcosa a che fare con i biscotti. Questo mi sta facendo impazzire.
Ryan Weinstein,

5
Questo sito utilizza la distilltecnologia di rilevamento dei bot e fornisce contenuti utilizzando akamaitechnologies.comCDN da differenti ips 95.100.59.245, ad esempio 104.70.243.66,23.202.161.241
SIslam

5
Sto riscontrando lo stesso problema con Selenium e il driver Firefox. La cosa interessante da notare è che eseguo Selenium in una macchina virtuale VMWare Workstation che accede a Internet tramite un NAT. La macchina host è in grado di accedere a stubhub, mentre la VM non è in grado di accedere quando si utilizza Selenium o anche l'istanza del browser Selenium avviata. Ho avuto l'istanza del browser VM bloccata e stubhub riconosce ancora la macchina e l'ha bloccata. Quindi deve eseguire in qualche modo un'impronta digitale del browser e della macchina.
Brian Cain,

Risposte:


55

Per utenti Mac

Sostituzione cdc_variabile usando Vim o Perl

Puoi usare vim, o come ha sottolineato @Vic Seedoubleyew nella risposta di @ Erti-Chris Eelmaa perl, per sostituire la cdc_variabile in chromedriver( Vedi il post di @ Erti-Chris Eelmaa per saperne di più su quella variabile ). L'utilizzo vimo perlimpedisce di dover ricompilare il codice sorgente o utilizzare un editor esadecimale. Assicurati di fare una copia dell'originale chromedriverprima di provare a modificarlo. Inoltre, sono stati testati i metodi seguenti chromedriver version 2.41.578706.


Usando Vim

vim /path/to/chromedriver

Dopo aver eseguito la riga sopra, probabilmente vedrai un mucchio di incomprensibili. Fare quanto segue:

  1. Cerca cdc_digitando /cdc_e premendo return.
  2. Abilita la modifica premendo a.
  3. Elimina qualsiasi quantità di $cdc_lasutopfhvcZLmcfle sostituisci ciò che è stato eliminato con caratteri di uguale quantità. In caso contrario, chromedriverfallirà.
  4. Al termine della modifica, premere esc.
  5. Per salvare le modifiche ed uscire, digitare :wq!e premere return.
  6. Se non si desidera salvare le modifiche, ma si desidera uscire, digitare :q!e premere return.
  7. Hai finito.

Vai all'alterato chromedrivere fai doppio clic su di esso. Una terminalfinestra dovrebbe aprirsi. Se non vedi killednell'output, hai modificato correttamente il driver.


Utilizzando Perl

La riga seguente sostituisce cdc_con dog_:

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

Assicurati che la stringa di sostituzione abbia lo stesso numero di caratteri della stringa di ricerca, altrimenti chromedriverfallirà.

Spiegazione Perl

s///g indica che si desidera cercare una stringa e sostituirla globalmente con un'altra stringa (sostituisce tutte le occorrenze).

per esempio, s/string/replacment/g

Così,

s/// indica la ricerca e la sostituzione di una stringa.

cdc_ è la stringa di ricerca.

dog_ è la stringa di sostituzione.

g è la chiave globale, che sostituisce ogni occorrenza della stringa.

Come verificare se la sostituzione del Perl ha funzionato

La seguente riga stamperà ogni occorrenza della stringa di ricerca cdc_:

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

Se questo non restituisce nulla, cdc_è stato sostituito.

Al contrario, puoi usare questo:

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

per vedere se la tua stringa di sostituzione dog_, ora è nel chromedriverbinario. In tal caso, la stringa di sostituzione verrà stampata sulla console.

Vai all'alterato chromedrivere fai doppio clic su di esso. Una terminalfinestra dovrebbe aprirsi. Se non vedi killednell'output, hai modificato correttamente il driver.


Avvolgendo

Dopo aver modificato il chromedriverbinario, assicurarsi che il nome del chromedriverbinario modificato sia chromedrivere che il binario originale sia spostato dalla sua posizione originale o rinominato.


La mia esperienza con questo metodo

In precedenza ero stato rilevato su un sito Web durante il tentativo di accesso, ma dopo aver sostituito cdc_con una stringa di dimensioni uguali, sono stato in grado di accedere. Come altri hanno già detto, se sei già stato rilevato, potresti essere bloccato per un molti altri motivi anche dopo aver usato questo metodo. Quindi potresti dover provare ad accedere al sito che ti stava rilevando usando una VPN, una rete diversa o cosa hai.


@LekaBaper Grazie per l'heads up. La versione di chromedriver che ho usato era la versione 2.41.578706.
Colossatr0n,

2
Non ha funzionato anche quando ho usato questa modifica di chromedriver.exe su un nuovo computer fisico su una rete diversa.
Ahmed Memon,

è un errore dice, questa versione non può funzionare in questo computer :(
Walid Bousseta,

@ colossatr0n C'è qualche fork open source non rilevabile di cui sei a conoscenza?
ishandutta2007,

3
Nota che le persone del chromedriver hanno dichiarato che questo problema non verrà risolto, quindi puoi aspettarti di dover usare un fork o modificare il binario per un futuro indefinito. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiologo

144

Fondamentalmente il modo in cui funziona il rilevamento del selenio è che testano le variabili javascript predefinite che appaiono quando si esegue con selenio. Gli script di rilevamento bot di solito sembrano qualsiasi cosa contenga la parola "selenio" / "webdriver" in una qualsiasi delle variabili (sull'oggetto finestra) e documentano anche le variabili chiamate $cdc_e $wdc_. Ovviamente, tutto questo dipende dal browser in cui ti trovi. Tutti i diversi browser espongono cose diverse.

Per me, ho usato Chrome, quindi tutto quello che dovevo fare era assicurarmi che $cdc_non esistesse più come variabile del documento e voilà (scarica il codice sorgente di chromedriver, modifica il cromedriver e ricompila $cdc_con un nome diverso).

questa è la funzione che ho modificato in 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];
}

(nota il commento, tutto quello che ho fatto mi sono rivolto $cdc_a randomblabla_.

Ecco uno pseudo-codice che dimostra alcune delle tecniche che le reti di bot potrebbero usare:

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

secondo l'utente @szx, è anche possibile semplicemente aprire chromedriver.exe nell'editor esadecimale e fare semplicemente la sostituzione manualmente, senza fare alcuna compilazione.


26
sì, ha funzionato senza problemi, nota un problema è che se cadessi nella "lista nera" PRIMA di questo cambiamento, è abbastanza difficile uscire. se si desidera uscire dalla lista nera esistente, è necessario implementare l'impronta digitale di tela falsa, disabilitare il flash, cambiare IP e cambiare l'ordine delle intestazioni della richiesta (scambia lingua e Accetta intestazioni). Una volta che sei entrato nella lista nera, hanno delle ottime misure per rintracciarti, anche se cambi IP, anche se apri Chrome in incognito, ecc.
Erti-Chris Eelmaa,

2
Ho trovato il file "/ Users / your_username / chromium / src / chrome / test / chromedriver / js"
JonghoKim

7
Ho semplicemente sostituito $cdccon xxxxin chromedriver.exeun editor esadecimale e ha funzionato! Ho anche notato che se ingrandisci la finestra del browser (anziché utilizzare una dimensione predefinita), viene rilevata meno spesso.
SZX,

2
era su windows, osx o linux? La modifica esadecimale su osx non sembra funzionare.
Nish,

5
esadecimale con $ zzz_zzzzzzzzzzzzzzzzzzzzzzzz_ (stessa quantità di caratteri) ma non ha funzionato.
Aymon Fournier,

100

Come abbiamo già capito nella domanda e nelle risposte pubblicate, qui c'è un servizio anti-Web-scraping e un servizio di rilevamento Bot chiamato "Distil Networks" . E, secondo l' intervista del CEO dell'azienda :

Anche se possono creare nuovi robot, abbiamo trovato un modo per identificare il selenio come uno strumento che stanno usando, quindi stiamo bloccando il selenio indipendentemente da quante volte iterano su quel bot . Lo stiamo facendo ora con Python e molte tecnologie diverse. Quando vediamo un modello emergere da un tipo di bot, lavoriamo per decodificare la tecnologia che usano e identificarlo come dannoso.

Ci vorranno tempo e ulteriori sfide per capire come stanno rilevando esattamente il selenio, ma cosa possiamo dire con certezza al momento:

  • non è correlato alle azioni che intraprendi con il selenio: una volta che accedi al sito, verrai immediatamente rilevato e bannato. Ho provato ad aggiungere ritardi casuali artificiali tra le azioni, fare una pausa dopo che la pagina è stata caricata - niente ha aiutato
  • non si tratta nemmeno dell'impronta digitale del browser - provata in più browser con profili puliti e non in modalità di navigazione in incognito - nulla ha aiutato
  • poiché, secondo il suggerimento nell'intervista, si trattava di "reverse engineering", sospetto che ciò avvenga con un codice JS eseguito nel browser che rivela che si tratta di un browser automatizzato tramite webdriver al selenio

Ha deciso di pubblicarlo come risposta, poiché chiaramente:

Un sito Web è in grado di rilevare quando si utilizza selenio con chromedriver?

Sì.


Inoltre, ciò che non ho sperimentato è il selenio più vecchio e le versioni più vecchie del browser - in teoria, potrebbe esserci qualcosa di implementato / aggiunto al selenio a un certo punto su cui si basa attualmente il rilevatore di bot di Distil Networks. Quindi, in questo caso, potremmo rilevare (sì, rileviamo il rilevatore) in quale punto / versione è stata apportata una modifica rilevante, esaminare il log delle modifiche e dei changeset e, potrebbe essere, ciò potrebbe darci maggiori informazioni su dove cercare e che cosa usano per rilevare un browser basato su webdriver. È solo una teoria che deve essere testata.


@RyanWeinstein bene, non abbiamo prove concrete e possiamo solo speculare e testare. Per ora, direi che hanno un modo per rilevarci usando il selenio. Prova a sperimentare versioni di selenio: questo potrebbe darti alcuni indizi.
alecxe

1
Potrebbe avere a che fare con il modo in cui vengono determinate le porte effimere? Il metodo rimane lontano da intervalli noti. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay

9
Easyjet sta usando il servizio distilnetwork, sì, può bloccare bot fittizi ma non complicati perché lo abbiamo testato con oltre 2000 richieste al giorno da IP diversi (che riutilizziamo di nuovo "stesso" indirizzo), quindi in pratica ogni IP va un 5-10 richieste al giorno e da questo posso dire che tutti questi servizi di rilevamento di bot sono lì solo per sviluppare e vendere circa il 45% di algoritmi di lavoro, lo scrapper che abbiamo usato è stato facile da rilevare, posso bloccarlo mentre reti di reti, schermi quadrati e altri non potrei spingermi a non usarne mai nessuno.
Jeffery ThaGintoki,

3
Penso che stiano rilevando navigator.webdriver in Chrome Webdriver. Ho provato a fare navigator.webdriver = false con l'aiuto di intoli.com/blog/not-possible-to-block-chrome-headless e stackoverflow.com/questions/47297877/... . Restituisce una pagina di rilevamento bot invece di distilnetworks.com/distil_identify_cookie.html
hoozecn

24

Esempio di come è implementato su 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
perché l'ultimo tentativo non è chiuso? inoltre puoi spiegare un po 'la tua risposta.
ishandutta2007,

16

Risultato offuscato di JavaScripts

Ho controllato il codice sorgente di chromedriver. Ciò inietta alcuni file javascript nel browser.
Ogni file javascript su questo link viene iniettato nelle pagine Web: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Quindi ho usato il reverse engineering e offuscato i file js con la modifica esadecimale. Ora ero sicuro che non fossero più utilizzate variabili javascript, nomi di funzioni e stringhe fisse per scoprire l'attività del selenio. Ma ancora alcuni siti e reCaptcha rilevano il selenio!
Forse controllano le modifiche causate dall'esecuzione di chromedriver js :)


Modifica 1:

Modifica parametri 'navigator' di Chrome

Ho scoperto che ci sono alcuni parametri in 'navigator' che scoprono brevemente l'uso di chromedriver. Questi sono i parametri:

  • "navigator.webdriver" In modalità non automatizzata è "indefinito". In modalità automatizzata è "vero".
  • "navigator.plugins" Su chrome senza testa ha lunghezza 0. Quindi ho aggiunto alcuni elementi falsi per ingannare il processo di controllo della lunghezza del plugin.
  • " navigator.languages" è stato impostato sul valore chrome predefinito '["en-US", "en", "es"]'.

Quindi quello di cui avevo bisogno era un'estensione di Chrome per eseguire JavaScript sulle pagine Web. Ho creato un'estensione con il codice js fornito nell'articolo e ho usato un altro articolo per aggiungere l'estensione zippata al mio progetto. Ho modificato con successo i valori; Ma non è cambiato nulla!

Non ho trovato altre variabili come queste, ma ciò non significa che non esistano. ReCaptcha rileva ancora chromedriver, quindi dovrebbero esserci più variabili da modificare. Il prossimo passo dovrebbe essere il reverse engineering dei servizi di rilevazione che non voglio fare.

Ora non sono sicuro che valga la pena dedicare più tempo a questo processo di automazione o cercare metodi alternativi!


12

Prova a utilizzare il selenio con un profilo utente specifico di Chrome, in questo modo puoi usarlo come utente specifico e definire qualsiasi cosa tu voglia, quando lo fai verrà eseguito come un utente "reale", guarda il processo di Chrome con un certo Explorer di processo e vedrai la differenza con i tag.

Per esempio:

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)

elenco di tag chrome qui


11

partial interface Navigator { readonly attribute boolean webdriver; };

L'attributo IDL webdriver dell'interfaccia Navigator deve restituire il valore del flag attivo webdriver, che inizialmente è falso.

Questa proprietà consente ai siti Web di determinare che l'agente utente è controllato da WebDriver e può essere utilizzato per mitigare gli attacchi denial-of-service.

Tratto direttamente dal Draft of WebDriver del W3C Editor del 2017 . Ciò implica fortemente che almeno le future iterazioni dei conducenti del selenio saranno identificabili per prevenire l'uso improprio. In definitiva, è difficile dire senza il codice sorgente cosa sia rilevabile esattamente il driver di Chrome in particolare.


4
"è difficile da dire senza il codice sorgente" .. beh, il codice sorgente è disponibile gratuitamente
Corey Goldberg,

6
Intendevo senza il codice sorgente del sito Web in questione. È difficile dire cosa stanno controllando.
Bryce,

8

Si dice che Firefox window.navigator.webdriver === truefunzioni se si lavora con un webdriver. Questo era secondo una delle specifiche più vecchie (ad esempio: archive.org ) ma non riuscivo a trovarlo nel nuovo, tranne per alcune parole molto vaghe nelle appendici.

Un test è nel codice del selenio nel file fingerprint_test.js in cui il commento alla fine dice "Attualmente implementato solo in Firefox" ma non sono stato in grado di identificare alcun codice in quella direzione con un semplice greping, né nel attuale (41.0.2) albero delle versioni di Firefox né dell'albero dei Chromium.

Ho anche trovato un commento per un vecchio commit riguardante l'impronta digitale nel driver firefox b82512999938 di gennaio 2015 . Quel codice è ancora nel selenio GIT-master scaricato ieri javascript/firefox-driver/extension/content/server.jscon un commento che si collega all'appendice leggermente diversa nelle attuali specifiche del webdriver w3c.


2
Ho appena testato il webdriver con Firefox 55 e posso confermare che non è vero. La variabile window.navigator.webdrivernon è definita
speedplane il

1
Aggiornamento: ho provato con Firefox 65, e questo è vero:window.navigator.webdriver == true
speedplane

Firefox versione 76 mostra ancora che è vero
user2284144

8

In aggiunta alla grande risposta di @Erti-Chris Eelmaa - c'è un fastidio window.navigator.webdrivered è di sola lettura. L'evento se si modifica il valore in falseesso avrà comunque true. Ecco perché il browser guidato da software automatizzato può ancora essere rilevato. MDN

La variabile è gestita dalla bandiera --enable-automationin cromo. I lanci chromedriver Chrome con quella bandiera e Chrome imposta il window.navigator.webdrivera true. Puoi trovarlo qui . Devi aggiungere a "exclude switch" il flag. Ad esempio (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

Sembra che siano dietro un firewall per applicazioni web. Dai un'occhiata a modsecurity e owasp per vedere come funzionano. In realtà, quello che stai chiedendo è come fare l'evasione del rilevamento bot. Questo non è ciò che serve per il driver web selenio. Serve per testare l'applicazione Web senza colpire altre applicazioni Web. È possibile, ma fondamentalmente, dovresti guardare a cosa cerca un WAF nel suo set di regole ed evitarlo specificamente con selenio se puoi. Anche allora, potrebbe non funzionare perché non sai quale WAF stanno usando. Hai fatto il primo passo giusto, ovvero la falsificazione dell'agente utente. Se però non ha funzionato, allora è in atto un WAF e probabilmente dovrai diventare più complicato.

Modifica: punto preso da un'altra risposta. Assicurati che il tuo user agent sia effettivamente impostato correttamente per primo. Forse ha colpito un server web locale o annusare il traffico in uscita.


Penso che tu sia sulla strada giusta. Ho testato con la mia configurazione e sostituito l'agente utente con una stringa agente utente valida che ha superato e ricevuto lo stesso risultato, stubhub ha bloccato la richiesta.
Brian Cain,

1
Questo argomento è molto vasto, direi che se non lo capisci e vuoi capirlo, qui non è il posto giusto. Inizia con owasp. Esamina i test di penetrazione e la sicurezza web. Inoltre, come ho detto prima, guarda in modsecurity e WAF per questo specifico argomento.
Bassel Samman,

1
Se si trattasse di un problema di intestazione HTTP, il normale browser non verrebbe bloccato? Le intestazioni HTTP sono esattamente le stesse. Inoltre, cosa sto guardando esattamente con quel link github? Hai provato a usare il selenio per andare su stubhub? Qualcosa è molto molto spento.
Ryan Weinstein,

1
Mi dispiace per la confusione. Lo esaminerò e non dovrai più aiutarmi se non vuoi. La maggior parte della mia esperienza è nelle applicazioni di sistemi di programmazione, quindi non avevo familiarità con queste regole di sicurezza di cui stai parlando. Darò un'occhiata e cercherò di educare me stesso. Non sto cercando di aggirare nulla, ero solo interessato a sapere come questi siti web rilevano un utente usando il selenio.
Ryan Weinstein,

1
Anch'io sono uno sviluppatore :). L'apprendimento è una causa che posso superare. Non mi dispiace aiutare, volevo solo chiarire che non conoscevo le tue intenzioni e non potevo esattamente aiutarti a bypassare la sicurezza del loro sito web. Per rispondere alla tua domanda, però, non è il selenio che stanno rilevando. Le regole hanno rilevato comportamenti sospetti e hanno deciso di adottare le misure appropriate contro il cliente offensivo. Ti catturano per ciò che non stai facendo più che per quello che stai facendo. Nel collegamento repository, è possibile effettuare il checkout di questo file per avere un'idea base_rules / modsecurity_crs_20_protocol_violations.conf
Bassel Samman,

6

Anche se stai inviando tutti i dati corretti (ad es. Il selenio non viene visualizzato come estensione, hai una risoluzione / profondità di bit ragionevole, ecc.), Ci sono una serie di servizi e strumenti che descrivono il comportamento dei visitatori per determinare se il attore è un utente o un sistema automatizzato.

Ad esempio, visitare un sito per eseguire immediatamente un'azione spostando il mouse direttamente sul pulsante corrispondente, in meno di un secondo, è qualcosa che nessun utente farebbe effettivamente.

Potrebbe anche essere utile come strumento di debug per utilizzare un sito come https://panopticlick.eff.org/ per verificare quanto sia unico il tuo browser; ti aiuterà anche a verificare se ci sono parametri specifici che indicano che stai eseguendo in Selenium.


3
Ho già utilizzato quel sito Web e l'impronta digitale è identica al mio normale browser. Inoltre non sto automatizzando nulla. Sto solo navigando come di consueto.
Ryan Weinstein,

6

Il rilevamento di bot che ho visto sembra più sofisticato o almeno diverso da quello che ho letto nelle risposte di seguito.

ESPERIMENTO 1:

  1. Apro un browser e una pagina Web con Selenium da una console Python.
  2. Il mouse è già in una posizione specifica in cui so che apparirà un collegamento una volta caricata la pagina. Non muovo mai il mouse.
  3. Premo il pulsante sinistro del mouse una volta (questo è necessario per attirare l'attenzione dalla console in cui Python è in esecuzione sul browser).
  4. Premo di nuovo il pulsante sinistro del mouse (ricorda, il cursore si trova sopra un determinato link).
  5. Il collegamento si apre normalmente, come dovrebbe.

ESPERIMENTO 2:

  1. Come prima, apro un browser e la pagina Web con Selenium da una console Python.

  2. Questa volta, invece di fare clic con il mouse, utilizzo Selenium (nella console Python) per fare clic sullo stesso elemento con un offset casuale.

  3. Il link non si apre, ma vengo indirizzato a una pagina di iscrizione.

IMPLICAZIONI:

  • l'apertura di un browser Web tramite Selenium non mi impedisce di apparire umano
  • non è necessario spostare il mouse come un essere umano per essere classificato come umano
  • facendo clic su qualcosa tramite selenio con un offset si genera ancora l'allarme

Sembra misterioso, ma immagino che possano solo determinare se un'azione proviene dal selenio o meno, mentre a loro non importa se il browser stesso è stato aperto tramite il selenio o meno. O possono determinare se la finestra ha lo stato attivo? Sarebbe interessante sapere se qualcuno ha qualche intuizione.


3
La mia convinzione è che il selenio inietta qualcosa nella pagina tramite javascript per trovare e accedere agli elementi. Questa iniezione è ciò che credo stiano rilevando.
zeusalmighty,

Hai ragione, questo test è valido al 100%. Avevo fatto test simili con gli stessi risultati. Potrei inviare la scheda Invio o inviare le chiavi. Nel momento in cui accedo agli elementi, la pagina ha smesso di funzionare. Quindi, se il driver inietta un po 'di javascript nel browser. Potremmo semplicemente crittografare quel javascript usando l'estensione chrome e decrittografare nella pagina successiva usando la stessa estensione. Proverò a guardarlo nei giorni seguenti.
Trixo

6

Un'altra cosa che ho scoperto è che alcuni siti Web utilizzano una piattaforma che controlla User Agent. Se il valore contiene: "HeadlessChrome" il comportamento può essere strano quando si utilizza la modalità senza testa.

La soluzione alternativa sarà quella di sovrascrivere il valore dell'agente utente, ad esempio 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");

5

Alcuni siti stanno rilevando questo:

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

Questo non funziona per Chrome e Firefox, selenio 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy

4

Scrivi una pagina HTML con il seguente codice. Vedrai che nel selenio DOM si applica un attributo webdriver in outerHTML

<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
L'attributo viene aggiunto solo in Firefox.
Louis,

1
Ed è possibile rimuoverlo dall'estensione di selenio che controlla il browser. Funzionerà comunque.
m3nda,

3

Ho trovato cambiando la variabile "chiave" javascript in questo modo:

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

funziona con alcuni siti Web quando si utilizza Selenium Webdriver insieme a Google Chrome, poiché molti siti controllano questa variabile per evitare di essere scartati da Selenium.


2

Mi sembra che il modo più semplice per farlo con Selenium sia intercettare l'XHR che restituisce l'impronta digitale del browser.

Ma poiché questo è un problema solo al selenio, è meglio usare qualcos'altro. Il selenio dovrebbe rendere le cose del genere più facili, non molto più difficili.


Quali sono le altre opzioni al selenio?
Tai

Immagino che le richieste sarebbero l'opzione principale di Python. Se invii le stesse esatte richieste inviate dal tuo browser, apparirai come un normale browser.
pguardiario,

2

Puoi provare a utilizzare il parametro "enable-automation"

var options = new ChromeOptions();

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

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

Ma voglio avvertire che questa capacità è stata risolta in ChromeDriver 79.0.3945.16 . Quindi probabilmente dovresti usare le versioni precedenti di Chrome.

Inoltre, come altra opzione, puoi provare a utilizzare InternetExplorerDriver anziché Chrome. Per quanto mi riguarda, IE non si blocca affatto senza alcun hack.

E per maggiori informazioni prova a dare un'occhiata qui:

Selenium webdriver: modifica del flag navigator.webdriver per impedire il rilevamento del selenio

Impossibile nascondere la barra dei dati "Chrome è controllato da un software automatizzato" in Chrome v76

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.