¿Puede un sitio web detectar cuando estás usando Selenium con Chromedriver?

Resuelto Ryan Weinstein asked hace 9 años • 26 respuestas

He estado probando Selenium con Chromedriver y noté que algunas páginas pueden detectar que estás usando Selenium aunque no haya ninguna automatización. Incluso cuando estoy navegando manualmente usando Chrome a través de Selenium y Xephyr , a menudo aparece una página que dice que se detectó actividad sospechosa. Revisé mi agente de usuario y la huella digital de mi navegador, y todos son exactamente idénticos al navegador Chrome normal.

Cuando navego por estos sitios en Chrome normal, todo funciona bien, pero en el momento en que uso Selenium me detectan.

En teoría, chromedriver y Chrome deberían verse literalmente exactamente iguales para cualquier servidor web, pero de alguna manera pueden detectarlo.

Si quieres algún código de prueba, prueba esto:

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

Si navegas por stubhub, serás redirigido y "bloqueado" en una o dos solicitudes. He estado investigando esto y no puedo entender cómo pueden saber que un usuario está usando Selenium.

¿Cómo lo hicieron?

Instalé el complemento Selenium IDE en Firefox y me prohibieron cuando entré a stubhub.com en el navegador Firefox normal con solo el complemento adicional.

Cuando uso Fiddler para ver las solicitudes HTTP que se envían de un lado a otro, noté que las solicitudes del 'navegador falso' a menudo tienen 'sin caché' en el encabezado de respuesta.

Resultados como este ¿Hay alguna manera de detectar que estoy en una página de Selenium Webdriver desde JavaScript? sugiere que no debería haber forma de detectar cuándo está utilizando un controlador web. Pero esta evidencia sugiere lo contrario.

El sitio carga una huella digital en sus servidores, pero lo verifiqué y la huella digital de Selenium es idéntica a la huella digital cuando se usa Chrome.

Esta es una de las cargas de huellas dactilares que envían a sus servidores:

{"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":"WidevineContentDecryptionMo
dule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":
{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-
flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContent
DecryptionModuleapplication/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":"Trebu
chetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationM
ono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

Es idéntico en Selenium y Chrome.

Las VPN funcionan para un solo uso, pero se detectan después de cargar la primera página. Claramente se está ejecutando algún código JavaScript para detectar Selenium.

Ryan Weinstein avatar Oct 20 '15 07:10 Ryan Weinstein
Aceptado

Básicamente, la forma en que funciona la detección de Selenium es que prueban variables de JavaScript predefinidas que aparecen cuando se ejecuta con Selenium. Los scripts de detección de bots generalmente buscan cualquier cosa que contenga la palabra "selenium" / "webdriver" en cualquiera de las variables (en el objeto de la ventana), y también documentan variables llamadas $cdc_y $wdc_. Por supuesto, todo esto depende del navegador que utilices. Todos los diferentes navegadores exponen cosas diferentes.

Para mí, usé Chrome, así que todo lo que tenía que hacer era asegurarme de que $cdc_ya no existiera como una variable de documento y listo (descargar el código fuente de Chromedriver, modificar Chromedriver y volver a compilar $cdc_con un nombre diferente).

Esta es la función que modifiqué en chromedriver:

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

(Tenga en cuenta el comentario. Todo lo que hice lo recurrí $cdc_a randomblabla_).

Aquí hay un pseudocódigo que demuestra algunas de las técnicas que las redes de bots podrían usar:

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

Según la respuesta , existen varios métodos para eliminarlos. Uno de ellos es simplemente abrir chromedriver.execon un editor HEX y eliminar todas las apariciones de$cdc_

Erti-Chris Eelmaa avatar Dec 19 '2016 10:12 Erti-Chris Eelmaa

Reemplazo cdc_de cuerda

Puede usar Vim o Perl para reemplazar la cdc_cadena en chromedriver. Vea la respuesta de @ Erti-Chris Eelmaa para obtener más información sobre esa cadena y cómo es un punto de detección .

Usar Vim o Perl evita que tengas que recompilar el código fuente o usar un editor hexadecimal.

Asegúrese de hacer una copia del original chromedriverantes de intentar editarlo.

Nuestro objetivo es alterar la cdc_cadena, que se parece a $cdc_lasutopfhvcZLmcfl.

Los métodos siguientes se probaron en chromedriver version 2.41.578706.


Usando Vim

vim -b /path/to/chromedriver

Después de ejecutar la línea anterior, probablemente verás un montón de galimatías. Haz lo siguiente:

  1. Reemplace todas las instancias de cdc_con dog_escribiendo :%s/cdc_/dog_/g.
    • dog_es solo un ejemplo. Puede elegir cualquier cosa siempre que tenga la misma cantidad de caracteres que la cadena de búsqueda (por ejemplo, cdc_); de lo contrario, chromedriverfallará.
  2. Para guardar los cambios y salir, escriba :wq!y presione return.
    • Si necesita salir sin guardar los cambios, escriba :q!y presione return.

La -bopción le dice a vim por adelantado que abra el archivo como binario, para que no interfiera con cosas como finales de línea (faltantes) (especialmente al final del archivo).


Usando Perl

La siguiente línea reemplaza todas cdc_las apariciones con dog_. Crédito a Vic Seedoubleyew :

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

Asegúrese de que la cadena de reemplazo (p. ej., dog_) tenga la misma cantidad de caracteres que la cadena de búsqueda (p. ej., cdc_); de lo contrario, chromedriverfallará.


Terminando

Para verificar que todas las apariciones de cdc_fueron reemplazadas:

grep "cdc_" /path/to/chromedriver

Si no se devolvió ningún resultado, el reemplazo fue exitoso.

Vaya al modificado chromedrivery haga doble clic en él. Debería abrirse una ventana de terminal. Si no lo ve killeden el resultado, ha modificado correctamente el controlador.

Asegúrese de que el nombre del chromedriverbinario modificado sea chromedrivery de que el binario original se mueva de su ubicación original o se le cambie el nombre.


Mi experiencia con este método

Anteriormente me detectaron en un sitio web mientras intentaba iniciar sesión, pero después de reemplazarlo cdc_con una cadena del mismo tamaño, pude iniciar sesión. Sin embargo, como han dicho otros, si ya te han detectado, es posible que te bloqueen por un tiempo. Hay una gran cantidad de otras razones incluso después de usar este método. Por lo que es posible que tengas que intentar acceder al sitio que te estaba detectando usando una VPN, una red diferente, etc.

colossatr0n avatar Aug 31 '2018 03:08 colossatr0n