¿Puede un sitio web detectar cuándo está usando selenio con chromedriver?

365

He estado probando Selenium con Chromedriver y noté que algunas páginas pueden detectar que estás usando Selenium a pesar de que no hay ninguna automatización. Incluso cuando estoy navegando manualmente solo usando Chrome a través de Selenium y Xephyr, a menudo recibo 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 igual para cualquier servidor web, pero de alguna manera pueden detectarlo.

Si quieres un 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 navega por stubhub, será redirigido y 'bloqueado' dentro de una o dos solicitudes. He estado investigando esto y no puedo entender cómo pueden decir que un usuario está usando Selenium.

¿Cómo lo hicieron?

EDITAR ACTUALIZACIÓN:

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

EDITAR:

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

EDITAR:

resultados como este ¿Hay alguna forma de detectar que estoy en una página de Selenium Webdriver desde Javascript? sugiere que no debería haber forma de detectar cuando está utilizando un webdriver. Pero esta evidencia sugiere lo contrario.

EDITAR:

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

EDITAR:

Esta es una de las cargas útiles de huellas digitales 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":"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 idéntico en selenio y en cromo.

EDITAR:

Las VPN funcionan para un solo uso, pero se detectan después de cargar la primera página. Claramente, se está ejecutando javascript para detectar Selenium.

Ryan Weinstein
fuente
44
@RyanWeinstein: No es tráfico. Supongo que Selenium necesita exponer algunos ganchos de JavaScript que se pueden detectar en el JavaScript del lado del cliente.
Mikko Ohtamaa
55
O si es tráfico, entonces es un patrón de tráfico ... estás navegando páginas demasiado rápido.
Mikko Ohtamaa
66
No estoy navegando demasiado rápido. Solo cargo una sola página y navego a través de ella normalmente con el mouse y el teclado. Tampoco tiene sentido que Selenium necesite exponer ganchos, porque literalmente ejecuta chrome.exe. Simplemente ejecuta Chrome normal y le permite obtener datos de él. ¿Alguna otra idea? Estaba pensando que tal vez tenga algo que ver con las cookies. Esto me está volviendo loco.
Ryan Weinstein
55
Este sitio utiliza distilltecnología de detección de bot y ofrece contenido utilizando akamaitechnologies.comCDN de diferentes ips 95.100.59.245, por ejemplo 104.70.243.66,23.202.161.241
SIslam
55
Estoy experimentando el mismo problema con Selenium y el controlador de Firefox. Lo interesante a tener en cuenta es que estoy ejecutando Selenium en una máquina virtual VMWare Workstation que está accediendo a Internet a través de un NAT. La máquina host puede acceder a stubhub, mientras que la VM no puede acceder al usar Selenium, o incluso la instancia de navegador Selenium lanzada. Tenía la instancia del navegador VM bloqueada y Stubhub todavía reconoce la máquina y la tiene bloqueada. Por lo tanto, debe realizar una huella digital del navegador y la máquina de alguna manera.
Brian Cain

Respuestas:

55

Para usuarios de Mac

Reemplazar cdc_variable usando Vim o Perl

Puede usar vim, o como @Vic Seedoubleyew ha señalado en la respuesta de @ Erti-Chris Eelmaa perl, para reemplazar la cdc_variable en chromedriver( Vea la publicación de @ Erti-Chris Eelmaa para obtener más información sobre esa variable ). Usar vimo perlevita tener que volver a compilar el código fuente o usar un editor hexadecimal. Asegúrese de hacer una copia del original chromedriverantes de intentar editarlo. Además, se probaron los siguientes métodos chromedriver version 2.41.578706.


Usando Vim

vim /path/to/chromedriver

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

  1. Busque cdc_escribiendo /cdc_y presionando return.
  2. Habilite la edición presionando a.
  3. Elimine cualquier cantidad de $cdc_lasutopfhvcZLmcfly reemplace lo que se eliminó con una cantidad igual de caracteres. Si no lo hace, chromedriverfallará.
  4. Una vez que haya terminado de editar, presione esc.
  5. Para guardar los cambios y salir, escriba :wq!y presione return.
  6. Si no desea guardar los cambios, pero desea salir, escriba :q!y presione return.
  7. Ya terminaste

Vaya a la alterada chromedrivery haga doble clic en ella. Se terminaldebe abrir una ventana. Si no ve killeden la salida, alteró con éxito el controlador.


Usando Perl

La siguiente línea reemplaza cdc_con dog_:

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

Asegúrese de que la cadena de reemplazo tenga el mismo número de caracteres que la cadena de búsqueda; de lo contrario chromedriver, fallará.

Explicación de Perl

s///g denota que desea buscar una cadena y reemplazarla globalmente con otra cadena (reemplaza todas las ocurrencias).

p.ej, s/string/replacment/g

Entonces,

s/// denota buscar y reemplazar una cadena.

cdc_ es la cadena de búsqueda

dog_ es la cadena de reemplazo.

g es la clave global, que reemplaza cada aparición de la cadena.

Cómo verificar si el reemplazo de Perl funcionó

La siguiente línea imprimirá cada aparición de la cadena de búsqueda cdc_:

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

Si esto no devuelve nada, entonces cdc_ha sido reemplazado.

Por el contrario, puede usar esto:

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

para ver si su cadena de reemplazo,, dog_ahora está en el chromedriverbinario. Si es así, la cadena de reemplazo se imprimirá en la consola.

Vaya a la alterada chromedrivery haga doble clic en ella. Se terminaldebe abrir una ventana. Si no ve killeden la salida, alteró con éxito el controlador.


Terminando

Después de alterar el chromedriverbinario, asegúrese de que el nombre del chromedriverbinario alterado sea chromedriver, y que el binario original se mueva de su ubicación original o cambie de nombre.


Mi experiencia con este método

Anteriormente me detectaban en un sitio web mientras intentaba iniciar sesión, pero después de reemplazarlo cdc_por una cadena de igual tamaño, pude iniciar sesión. Como otros han dicho, si ya lo han detectado, es posible que se bloquee por un muchas otras razones, incluso después de usar este método. Por lo tanto, es posible que deba intentar acceder al sitio que lo estaba detectando utilizando una VPN, una red diferente o lo que sea que tenga.

colossatr0n
fuente
@LekaBaper Gracias por el aviso. La versión de chromedriver que utilicé fue la versión 2.41.578706.
colossatr0n
2
No funcionó incluso cuando usé esta modificación chromedriver.exe en una nueva computadora física en una red diferente.
Ahmed Memon
es dar un error dice, esta versión no puede funcionar en esta computadora :(
Walid Bousseta
@ colossatr0n ¿Hay alguna bifurcación de código abierto indetectable que conozca?
ishandutta2007
3
Tenga en cuenta que la gente de chromedriver ha declarado que este problema no se solucionará, por lo que puede esperar tener que usar una bifurcación o editar el binario para el futuro indefinido. bugs.chromium.org/p/chromedriver/issues/detail?id=3220
Kodiólogo
144

Básicamente, la forma en que funciona la detección de selenio es que prueban las variables de JavaScript predefinidas que aparecen cuando se ejecuta con selenio. Las secuencias de comandos de detección de bot generalmente parecen cualquier cosa que contenga la palabra "selenio" / "controlador web" en cualquiera de las variables (en el objeto de ventana), y también documentan las variables llamadas $cdc_y $wdc_. Por supuesto, todo esto depende del navegador en el que se encuentre. Todos los diferentes navegadores exponen diferentes cosas.

Para mí, utilicé Chrome, por lo que todo lo que tenía que hacer era asegurarme de que $cdc_ya no existiera como variable de documento, y listo (descargue el código fuente de chromedriver, modifique chromedriver y vuelva a compilar $cdc_con un nombre diferente).

esta es la función que modifiqué en 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];
}

(tenga en cuenta el comentario, todo lo que hice me di $cdc_a randomblabla_.

Aquí hay un pseudocódigo que muestra algunas de las técnicas que las redes bot pueden 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;
};

de acuerdo con el usuario @szx, también es posible simplemente abrir chromedriver.exe en el editor hexadecimal, y simplemente hacer el reemplazo manualmente, sin hacer ninguna compilación.

Erti-Chris Eelmaa
fuente
26
sí, funcionó sin problemas, tenga en cuenta que un problema es que si cayó en la "lista negra" ANTES de este cambio, es bastante difícil salir. si desea salir de la lista negra existente, debe implementar huellas digitales de lienzo falsas, deshabilitar flash, cambiar IP y cambiar el orden de encabezado de la solicitud (cambiar el idioma y aceptar encabezados). Una vez que caíste en la lista negra, tienen muy buenas medidas para seguirte, incluso si cambias de IP, incluso si abres Chrome en incógnito, etc.
Erti-Chris Eelmaa
2
Encontré el archivo "/ Users / your_username / chromium / src / chrome / test / chromedriver / js"
JonghoKim
77
Simplemente reemplacé $cdccon xxxxen chromedriver.exeun editor hexadecimal y funcionó! También noté que si maximiza la ventana del navegador (en lugar de usar un tamaño predefinido), se detecta con menos frecuencia.
szx
2
¿Fue esto en Windows, OSX o Linux? La edición hexadecimal en osx no parece funcionar.
Nish
55
editado en hexadecimal con $ zzz_zzzzzzzzzzzzzzzzzzzzzz_ (la misma cantidad de caracteres) pero no funcionó.
Aymon Fournier el
100

Como ya hemos descubierto en la pregunta y las respuestas publicadas, hay un servicio anti-scraping y un servicio de detección de Bot llamado "Distil Networks" en juego aquí. Y, según la entrevista del CEO de la compañía :

A pesar de que pueden crear nuevos bots, descubrimos una forma de identificar Selenium con la herramienta que están utilizando, por lo que estamos bloqueando Selenium sin importar cuántas veces iteren en ese bot . Lo estamos haciendo ahora con Python y muchas tecnologías diferentes. Una vez que vemos emerger un patrón de un tipo de bot, trabajamos para aplicar ingeniería inversa a la tecnología que usan e identificarlo como malicioso.

Tomará tiempo y desafíos adicionales entender cómo exactamente están detectando Selenium, pero qué podemos decir con seguridad en este momento:

  • no está relacionado con las acciones que realiza con selenio: una vez que navega por el sitio, se lo detecta y lo prohíbe de inmediato. Intenté agregar retrasos aleatorios artificiales entre acciones, hacer una pausa después de cargar la página, nada ayudó
  • tampoco se trata de la huella digital del navegador: lo probé en varios navegadores con perfiles limpios y no en modos de incógnito; nada ayudó
  • dado que, de acuerdo con la sugerencia de la entrevista, esto era "ingeniería inversa", sospecho que esto se hace con algún código JS que se ejecuta en el navegador que revela que este es un navegador automatizado a través del controlador web de selenio

Decidí publicarlo como respuesta, ya que claramente:

¿Puede un sitio web detectar cuándo está usando selenio con chromedriver?

Si.


Además, con lo que no he experimentado es con selenio más antiguo y versiones más antiguas del navegador: en teoría, podría haber algo implementado / agregado al selenio en un punto determinado en el que actualmente se basa el detector de bot de Distil Networks. Entonces, si este es el caso, podríamos detectar (sí, detectemos el detector) en qué punto / versión se realizó un cambio relevante, buscar en el registro de cambios y conjuntos de cambios y, tal vez, esto podría darnos más información sobre dónde buscar y qué es lo que usan para detectar un navegador webdriver. Es solo una teoría que necesita ser probada.

alecxe
fuente
@RyanWeinstein bueno, no tenemos pruebas reales y solo podemos especular y probar. Por ahora, diría que tienen una manera de detectarnos usando selenio. Intente experimentar con versiones de selenio; esto puede darle algunas pistas.
alecxe
1
¿Podría tener que ver con cómo se determinan los puertos efímeros? El método se mantiene alejado de los rangos conocidos. github.com/SeleniumHQ/selenium/blob/…
Elliott de Launay
99
Easyjet está utilizando el servicio de red de destilación, sí, puede bloquear bots ficticios, pero no los complicados, porque lo hemos probado con más de 2000 solicitudes al día de diferentes IP (que reutilizamos nuevamente 'la misma dirección'), así que básicamente cada IP va para un 5-10 solicitudes por día y de esto puedo decir que todos estos servicios de detección de bots están ahí para desarrollar y vender alrededor del 45% de algoritmos de trabajo, el scrapper que utilizamos fue fácil de detectar, puedo bloquearlo mientras destilnetworks, squareshield y otros no podía, lo que me empujó a nunca usar ninguno de ellos.
Jeffery ThaGintoki
3
Creo que están detectando navigator.webdriver en chrome webdriver. Traté de hacer navigator.webdriver = false con la ayuda de intoli.com/blog/not-possible-to-block-chrome-headless y stackoverflow.com/questions/47297877/… . Devuelve una página de detección de bot en lugar de distilnetworks.com/distil_identify_cookie.html
hoozecn el
24

Ejemplo de cómo se implementa en 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
fuente
13
¿Por qué no se cierra el último intento? Además, ¿puedes explicar un poco tu respuesta?
ishandutta2007
16

Resultado de ofuscación de JavaScripts

He comprobado el código fuente de chromedriver. Eso inyecta algunos archivos javascript al navegador.
Todos los archivos javascript de este enlace se inyectan en las páginas web: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Así que utilicé ingeniería inversa y ofusqué los archivos js mediante edición hexadecimal. Ahora estaba seguro de que no se usaron más variables de JavaScript, nombres de funciones y cadenas fijas para descubrir la actividad de selenio. ¡Pero todavía algunos sitios y reCaptcha detectan selenio!
Tal vez verifican las modificaciones causadas por la ejecución de chromedriver js :)


Editar 1:

Modificación de parámetros de 'navegador' de Chrome

Descubrí que hay algunos parámetros en 'navegador' que descubren brevemente el uso de chromedriver. Estos son los parámetros:

  • "navigator.webdriver" En modo no automatizado, está "indefinido". En modo automatizado es 'verdadero'.
  • "navigator.plugins" En Chrome sin cabeza tiene 0 longitud. Así que agregué algunos elementos falsos para engañar el proceso de comprobación de la longitud del complemento.
  • " navigator.languages" se configuró en el valor predeterminado de Chrome '["en-US", "en", "es"]'.

Entonces, lo que necesitaba era una extensión de Chrome para ejecutar JavaScript en las páginas web. Hice una extensión con el código js provisto en el artículo y usé otro artículo para agregar la extensión comprimida a mi proyecto. He cambiado con éxito los valores; ¡Pero todavía nada ha cambiado!

No encontré otras variables como estas, pero eso no significa que no existan. Todavía reCaptcha detecta el controlador cromático, por lo que debería haber más variables para cambiar. El siguiente paso debería ser la ingeniería inversa de los servicios de detectores que no quiero hacer.

¡Ahora no estoy seguro de si vale la pena dedicar más tiempo a este proceso de automatización o buscar métodos alternativos!

ShayanKM
fuente
12

Intente usar selenio con un perfil de usuario específico de Chrome, de esa manera puede usarlo como usuario específico y definir lo que quiera, al hacerlo se ejecutará como un usuario 'real', observe el proceso de Chrome con algún explorador de procesos y Verás la diferencia con las etiquetas.

Por ejemplo:

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)

lista de etiquetas de Chrome aquí

Kobi K
fuente
11

partial interface Navigator { readonly attribute boolean webdriver; };

El atributo IDL de webdriver de la interfaz del navegador debe devolver el valor de la bandera activa de webdriver, que inicialmente es falso.

Esta propiedad permite que los sitios web determinen que WebDriver controla el agente de usuario y se puede usar para ayudar a mitigar los ataques de denegación de servicio.

Tomado directamente del Borrador de WebDriver del Editor del W3C 2017 . Esto implica en gran medida que, al menos, las futuras iteraciones de los controladores de selenio serán identificables para evitar el mal uso. En última instancia, es difícil saber sin el código fuente, qué es exactamente lo que hace que el controlador de Chrome en específico sea detectable.

Bryce
fuente
44
"es difícil saberlo sin el código fuente" ... bueno, el código fuente está disponible gratuitamente
Corey Goldberg
66
Quise decir sin el código fuente del sitio web en cuestión. Es difícil saber con qué están comprobando.
Bryce
8

Se dice que Firefox se configura window.navigator.webdriver === truesi se trabaja con un controlador web. Eso fue de acuerdo con una de las especificaciones más antiguas (por ejemplo: archive.org ), pero no pude encontrarla en la nueva, excepto por una redacción muy vaga en los apéndices.

Una prueba de esto está en el código de selenio en el archivo fingerprint_test.js donde el comentario al final dice "Actualmente solo implementado en Firefox" pero no pude identificar ningún código en esa dirección con algo simple grep, ni en el actual (41.0.2) Firefox release-tree ni en el árbol de Chromium.

También encontré un comentario para una confirmación anterior con respecto a las huellas digitales en el controlador firefox b82512999938 de enero de 2015 . Ese código todavía está en el Selenium GIT-master descargado ayer javascript/firefox-driver/extension/content/server.jscon un comentario que enlaza con el apéndice redactado de forma ligeramente diferente en la especificación actual del controlador web w3c.

deamentiaemundi
fuente
2
Acabo de probar webdriver con Firefox 55 y puedo confirmar que esto no es cierto. La variable window.navigator.webdriverno está definida.
Speedplane
1
Actualización: probé con Firefox 65, y esto es cierto:window.navigator.webdriver == true
speedplane
Firefox versión 76 todavía muestra que es cierto
user2284144
8

Además de la gran respuesta de @ Erti-Chris Eelmaa : hay una molestia window.navigator.webdrivery es de solo lectura. Evento si cambia el valor de la misma falsetodavía tendrá true. Es por eso que aún se puede detectar el navegador controlado por software automatizado. MDN

La variable es administrada por la bandera --enable-automationen cromo. El chromedriver lanza Chrome con esa bandera y Chrome establece el window.navigator.webdrivera true. Lo puedes encontrar aquí . Debe agregar a "excluir interruptores" la bandera. Por ejemplo (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
fuente
6

Parece que están detrás de un firewall de aplicaciones web. Eche un vistazo a modsecurity y owasp para ver cómo funcionan. En realidad, lo que está preguntando es cómo hacer la evasión de detección de bot. Para eso no está el controlador web de selenio. Es para probar que su aplicación web no afecta a otras aplicaciones web. Es posible, pero básicamente, tendría que mirar lo que busca un WAF en su conjunto de reglas y evitarlo específicamente con selenio si puede. Incluso entonces, podría no funcionar porque no sabes qué WAF están usando. Hiciste el primer paso correcto, que es fingir el agente de usuario. Sin embargo, si eso no funcionó, entonces hay un WAF en su lugar y probablemente deba ser más complicado.

Editar: Punto tomado de otra respuesta. Asegúrese de que su agente de usuario se esté configurando correctamente primero. Tal vez haga que llegue a un servidor web local o huela el tráfico que sale.

Bassel Samman
fuente
Creo que estás en el camino correcto. Probé con mi configuración y reemplacé el Agente de usuario con una cadena de agente de usuario válida que se realizó correctamente y recibió el mismo resultado, stubhub bloqueó la solicitud.
Brian Cain
1
Este tema es muy amplio, diría que si no lo entiende y quiere entenderlo, aquí no es el lugar correcto. Comience con owasp. Examine las pruebas de penetración y la seguridad web. Además, como dije antes, busque en Modsecurity y WAF específicamente para este tema.
Bassel Samman
1
Si se tratara de un problema de encabezado HTTP, ¿no se bloquearía el navegador normal? Los encabezados HTTP son exactamente iguales. Además, ¿qué estoy mirando exactamente con ese enlace github? ¿Has intentado usar selenio para usar stubhub? Algo está muy, muy mal.
Ryan Weinstein
1
Siento la confusión. Lo investigaré y ya no tienes que ayudarme si no quieres. La mayor parte de mi experiencia es en la programación de aplicaciones de sistemas, por lo que no estaba familiarizado con estas reglas de seguridad de las que estás hablando. Echaré un vistazo e intentaré educarme. No estoy tratando de eludir nada, solo estaba interesado en saber cómo estos sitios web detectan a un usuario que usa selenio.
Ryan Weinstein
1
Soy un desarrollador también :). El aprendizaje es una causa que puedo retrasar. No me importa ayudar, solo quería dejar en claro que no conocía tus intenciones y que no podía ayudarte exactamente a evitar la seguridad de su sitio web. Sin embargo, para responder a su pregunta, no es selenio lo que están detectando. Las reglas detectaron un comportamiento sospechoso y decidieron tomar las medidas apropiadas contra el cliente infractor. Te atrapan por lo que no estás haciendo más que por lo que estás haciendo. En el enlace del repositorio, puede consultar este archivo para tener una idea base_rules / modsecurity_crs_20_protocol_violations.conf
Bassel Samman
6

Incluso si está enviando todos los datos correctos (por ejemplo, Selenium no aparece como una extensión, tiene una resolución razonable / profundidad de bits, etc.), hay una serie de servicios y herramientas que muestran el comportamiento del visitante para determinar si actor es un usuario o un sistema automatizado.

Por ejemplo, visitar un sitio e inmediatamente realizar alguna acción moviendo el mouse directamente al botón correspondiente, en menos de un segundo, es algo que ningún usuario realmente haría.

También podría ser útil como herramienta de depuración para usar un sitio como https://panopticlick.eff.org/ para verificar qué tan único es su navegador; también lo ayudará a verificar si hay algún parámetro específico que indique que está ejecutando en Selenium.

lfaraone
fuente
3
Ya he usado ese sitio web y la huella digital es idéntica a mi navegador normal. Además, no estoy automatizando nada. Solo estoy navegando normalmente.
Ryan Weinstein
6

La detección de bot que he visto parece más sofisticada o al menos diferente de lo que he leído en las respuestas a continuación.

EXPERIMENTO 1:

  1. Abro un navegador y una página web con Selenium desde una consola Python.
  2. El mouse ya está en una ubicación específica donde sé que aparecerá un enlace una vez que se cargue la página. Nunca muevo el mouse.
  3. Presiono el botón izquierdo del mouse una vez (esto es necesario para enfocar desde la consola donde Python se está ejecutando al navegador).
  4. Presiono el botón izquierdo del mouse nuevamente (recuerde, el cursor está sobre un enlace dado).
  5. El enlace se abre normalmente, como debería.

Experimento 2:

  1. Como antes, abro un navegador y la página web con Selenium desde una consola Python.

  2. Esta vez, en lugar de hacer clic con el mouse, uso Selenium (en la consola de Python) para hacer clic en el mismo elemento con un desplazamiento aleatorio.

  3. El enlace no se abre, pero me llevan a una página de registro.

TRASCENDENCIA:

  • abrir un navegador web a través de Selenium no me impide aparecer como humano
  • mover el mouse como un humano no es necesario para ser clasificado como humano
  • Al hacer clic en algo a través de Selenium con un desplazamiento todavía se genera la alarma.

Parece misterioso, pero supongo que solo pueden determinar si una acción se origina en Selenium o no, mientras que no les importa si el navegador se abrió a través de Selenium o no. ¿O pueden determinar si la ventana tiene foco? Sería interesante saber si alguien tiene alguna idea.

M3RS
fuente
3
Creo que Selenium inyecta algo en la página a través de JavaScript para buscar y acceder a elementos. Esta inyección es lo que creo que están detectando.
zeusalmighty
Tienes razón, esta prueba es 100% válida. Hice una prueba similar con los mismos resultados. Podría enviar la pestaña Entrar o enviar claves. En el momento en que accedo a elementos, la página dejó de funcionar. Entonces, si el controlador inyecta algo de JavaScript en el navegador. Podríamos encriptar ese javascript usando la extensión de Chrome y descifrar en la página siguiente usando la misma extensión. Trataré de verlo los días siguientes.
Trixo
6

Una cosa más que encontré es que algunos sitios web utilizan una plataforma que verifica el Agente de usuario. Si el valor contiene: "HeadlessChrome", el comportamiento puede ser extraño cuando se utiliza el modo sin cabeza.

La solución para eso será anular el valor del agente de usuario, por ejemplo en 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
fuente
5

Algunos sitios están detectando esto:

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
fuente
Esto no funciona para Chrome y Firefox, selenium 3.5.0, ChromeDriver 2.31.488774, geckodriver 0.18.0
jerrypy
4

Escribe una página html con el siguiente código. Verá que en el DOM selenio se aplica un atributo webdriver en el HTML externo

<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
fuente
44
El atributo se agrega solo en Firefox.
Louis
1
Y es posible eliminarlo de la extensión de selenio que controla el navegador. Funcionará de todos modos.
m3nda
3

He encontrado cambiar la variable "clave" de javascript de esta manera:

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

funciona para algunos sitios web cuando se utiliza Selenium Webdriver junto con Google Chrome, ya que muchos sitios verifican esta variable para evitar que Selenium lo descarte.

Juliagu
fuente
2

Me parece que la forma más sencilla de hacerlo con Selenium es interceptar el XHR que envía la huella digital del navegador.

Pero dado que este es un problema solo de selenio, es mejor usar otra cosa. Se supone que el selenio hace que cosas como esta sean más fáciles, no mucho más difíciles.

pguardiario
fuente
¿Cuáles son otras opciones para el selenio?
Tai
Supongo que Requests sería la opción principal de Python. Si envía las mismas solicitudes exactas que envía su navegador, aparecerá como un navegador normal.
pguardiario
2

Puede intentar usar el parámetro "enable-automation"

var options = new ChromeOptions();

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

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

Pero quiero advertir que esta capacidad se solucionó en ChromeDriver 79.0.3945.16 . Así que probablemente deberías usar versiones anteriores de Chrome.

Además, como otra opción, puede intentar usar InternetExplorerDriver en lugar de Chrome. En cuanto a mí, IE no bloquea en absoluto sin ningún truco.

Y para más información intenta echar un vistazo aquí:

Selenium webdriver: modificación del indicador navigator.webdriver para evitar la detección de selenio

No se puede ocultar la barra de información "Chrome está siendo controlado por software automatizado" dentro de Chrome v76

Sergiy Matvienko
fuente