599 votes

Un site Web peut-il détecter si vous utilisez Selenium avec Chromedriver ?

J'ai testé Selenium avec Chromedriver et j'ai remarqué que certaines pages peuvent détecter que vous utilisez Selenium même s'il n'y a pas d'automatisation du tout. Même lorsque je ne fais que naviguer manuellement en utilisant Chrome via Selenium et Xephyr, j'obtiens souvent une page indiquant qu'une activité suspecte a été détectée. J'ai vérifié mon agent utilisateur et l'empreinte digitale de mon navigateur, et ils sont tous exactement identiques à ceux du navigateur chrome normal.

Lorsque je navigue sur ces sites en chrome normal, tout fonctionne bien, mais dès que j'utilise Selenium, je suis détecté.

En théorie, chromedriver et chrome devraient avoir exactement la même apparence pour n'importe quel serveur web, mais d'une manière ou d'une autre, ils peuvent le détecter.

Si vous voulez un code de test, essayez ceci :

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 vous vous promenez sur stubhub, vous serez redirigé et "bloqué" en une ou deux demandes. J'ai enquêté sur ce problème et je n'arrive pas à comprendre comment ils peuvent savoir qu'un utilisateur utilise Selenium.

Comment font-ils ?

EDIT UPDATE :

J'ai installé le plugin Selenium IDE dans Firefox et j'ai été banni lorsque je suis allé sur stubhub.com dans le navigateur normal de Firefox avec seulement le plugin supplémentaire.

EDIT :

Lorsque j'utilise Fiddler pour visualiser les requêtes HTTP envoyées dans les deux sens, j'ai remarqué que les requêtes du "faux navigateur" ont souvent "no-cache" dans l'en-tête de réponse.

EDIT :

les résultats sont les suivants Existe-t-il un moyen de détecter que je suis dans une page Selenium Webdriver à partir de Javascript ? suggère qu'il ne devrait pas y avoir de moyen de détecter si vous utilisez un webdriver. Mais cette preuve suggère le contraire.

EDIT :

Le site télécharge une empreinte digitale sur leurs serveurs, mais j'ai vérifié et l'empreinte digitale de selenium est identique à l'empreinte digitale en utilisant chrome.

EDIT :

C'est une des charges utiles d'empreintes digitales qu'ils envoient à leurs serveurs.

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

Il est identique en sélénium et en chrome

EDIT :

Les VPN fonctionnent pour une seule utilisation mais sont détectés dès que je charge la première page. Il est clair qu'un javascript est exécuté pour détecter Selenium.

0 votes

Je vous suggère d'utiliser un proxy local pour jeter un coup d'oeil au trafic web allant de votre requête au serveur et inversement. Vous devriez être capable de le dire à partir de là. fiddler, burp, ZED proxy, n'importe lequel d'entre eux fera l'affaire. Je préfère Burp

0 votes

Je l'ai fait et il n'y a aucune différence entre les demandes. Comment peuvent-ils faire ça ?

6 votes

@RyanWeinstein : Ce n'est pas le trafic. Ma supposition est que Selenium doit exposer certains crochets JavaScript qui peuvent être détectés sur le JavaScript côté client.

142voto

alecxe Points 50783

Comme nous l'avons déjà compris dans la question et les réponses postées, il existe un service anti-scraping Web et de détection des Bot appelé "Distil Networks" en jeu ici. Et, selon le PDG de l'entreprise interview :

Même s'ils peuvent créer de nouveaux bots, on a trouvé un moyen d'identifier Selenium comme un outil qu'ils utilisent, donc nous bloquons Selenium peu importe peu importe le nombre de fois qu'ils itèrent sur ce robot. . C'est ce que nous faisons maintenant avec Python et beaucoup de technologies différentes. Une fois que nous voyons un modèle émerger d'un type de bot, alors nous travaillons à la rétroconception de la la technologie qu'ils utilisent et l'identifier comme malveillante.

Il faudra du temps et des défis supplémentaires pour comprendre comment ils détectent exactement le Selenium, mais nous ne pouvons pas en être sûrs pour le moment :

  • ce n'est pas lié aux actions que vous faites avec selenium - une fois que vous naviguez sur le site, vous êtes immédiatement détecté et banni. J'ai essayé d'ajouter des délais artificiels aléatoires entre les actions, de faire une pause après le chargement de la page - rien n'y fait.
  • il ne s'agit pas non plus de l'empreinte digitale du navigateur - j'ai essayé dans plusieurs navigateurs avec des profils propres ou non, des modes incognito - rien n'y a fait.
  • puisque, selon l'allusion dans l'interview, il s'agit de "reverse engineering", je soupçonne que cela est fait avec du code JS exécuté dans le navigateur révélant qu'il s'agit d'un navigateur automatisé via selenium webdriver.

J'ai décidé de le poster comme une réponse, puisque clairement :

Un site Web peut-il détecter si vous utilisez Selenium avec Chromedriver ?

Oui.


De plus, je n'ai pas encore expérimenté les anciennes versions de selenium et de navigateur. En théorie, il pourrait y avoir quelque chose d'implémenté/ajouté à selenium à un moment donné sur lequel le détecteur de bots de Distil Networks s'appuie actuellement. Si c'est le cas, nous pourrions détecter (ouais, détectons le détecteur) à quel moment/version un changement pertinent a été fait, regarder dans le changelog et les changesets et, peut-être, cela pourrait nous donner plus d'informations sur où chercher et ce qu'ils utilisent pour détecter un navigateur alimenté par webdriver. Ce n'est qu'une théorie qui doit être testée.

0 votes

@RyanWeinstein eh bien, nous n'avons aucune preuve réelle et nous ne pouvons que spéculer et tester. Pour l'instant, je dirais qu'ils ont un moyen de nous détecter en utilisant le sélénium. Essayez d'expérimenter les versions de selenium - cela peut vous donner des indices.

1 votes

Cela pourrait-il avoir un rapport avec la façon dont les ports éphémères sont déterminés ? La méthode reste à l'écart des plages bien connues. github.com/SeleniumHQ/selenium/blob/

11 votes

Easyjet utilise le service distilnetwork, oui il peut bloquer les bots factices mais pas les bots compliqués car nous l'avons testé avec plus de 2000 requêtes par jour provenant de différentes IP (que nous réutilisons à nouveau à la 'même' adresse) donc en gros chaque IP reçoit 5-10 requêtes par jour et à partir de cela je peux dire que tous ces services de détection de bots sont juste là pour développer et vendre quelques algorithmes qui fonctionnent à 45%, le scrapper que nous avons utilisé était facile à détecter, je peux le bloquer alors que destilnetworks, squareshield et d'autres ne le pouvaient pas ce qui m'a poussé à ne jamais les utiliser.

10voto

deamentiaemundi Points 1650

Firefox est censé régler window.navigator.webdriver === true si vous travaillez avec un webdriver. C'était selon l'une des anciennes spécifications (par ex : archive.org ), mais je n'ai pas pu le trouver dans la section nouveau à l'exception d'une formulation très vague dans les annexes.

Un test pour cela se trouve dans le code selenium dans le fichier fingerprint_test.js où le commentaire à la fin dit "Currently only implemented in firefox" mais je n'ai pas été capable d'identifier un code dans cette direction avec quelques simples grep ni dans l'arbre de la version actuelle (41.0.2) de Firefox, ni dans l'arbre de Chromium.

J'ai également trouvé un commentaire pour un ancien commit concernant l'empreinte digitale dans le pilote firefox. b82512999938 de janvier 2015 . Ce code est toujours dans le GIT-master Selenium téléchargé hier à l'adresse suivante javascript/firefox-driver/extension/content/server.js avec un commentaire renvoyant à l'annexe légèrement différente de la spécification actuelle de w3c webdriver.

2 votes

Je viens de tester webdriver avec Firefox 55 et je peux confirmer que ce n'est pas vrai. La variable window.navigator.webdriver n'est pas défini.

2 votes

Mise à jour : j'ai testé avec Firefox 65, et c'est vrai : window.navigator.webdriver == true

7voto

Bassel Samman Points 633

Il semble qu'ils soient derrière un pare-feu d'application web. Jetez un œil à modsecurity et owasp pour voir comment ils fonctionnent. En réalité, ce que vous demandez, c'est comment échapper à la détection des robots. Ce n'est pas à cela que sert le pilote web Selenium. Il sert à vérifier que votre application Web ne touche pas d'autres applications Web. C'est possible, mais il vous faudra examiner ce qu'un WAF recherche dans son ensemble de règles et l'éviter spécifiquement avec Sélénium si vous le pouvez. Même dans ce cas, cela peut ne pas fonctionner car vous ne savez pas quel WAF ils utilisent. Vous avez fait la bonne première étape, c'est-à-dire simuler l'agent utilisateur. Si cela n'a pas fonctionné, c'est qu'un WAF est en place et que vous devez probablement vous montrer plus rusé.

Modifier : Point repris de l'autre réponse. Assurez-vous d'abord que votre agent utilisateur est correctement défini. Peut-être qu'il faut frapper un serveur web local ou renifler le trafic sortant.

0 votes

Je pense que vous êtes sur la bonne voie. J'ai testé avec ma configuration et j'ai remplacé l'agent utilisateur par une chaîne d'agent utilisateur valide qui est passée avec succès et j'ai obtenu le même résultat, stubhub a bloqué la demande.

0 votes

Ok, si l'agent utilisateur est bon, alors ils ont une détection d'attaque en place pour sûr. Le WAF est un bon endroit pour commencer. Non pas que j'excuse le fait de frapper d'autres sites web. Je réponds simplement au nom de la science et de l'avancement de la connaissance humaine.

0 votes

Essayez d'ajouter : driver.set_preference("general.useragent.override","your_use‌​r_agent_string")

6voto

lfaraone Points 6095

Même si vous envoyez toutes les bonnes données (par exemple, Selenium n'apparaît pas comme une extension, vous avez une résolution/profondeur de bit raisonnable, etc.), il existe un certain nombre de services et d'outils qui profilent le comportement des visiteurs pour déterminer si l'acteur est un utilisateur ou un système automatisé.

Par exemple, visiter un site puis effectuer immédiatement une action en déplaçant la souris directement sur le bouton correspondant, en moins d'une seconde, est quelque chose qu'aucun utilisateur ne ferait réellement.

Il pourrait également être utile, en tant qu'outil de débogage, d'utiliser un site tel que https://panopticlick.eff.org/ pour vérifier l'unicité de votre navigateur ; il vous aidera également à vérifier si des paramètres spécifiques indiquent que vous êtes en train d'exécuter Selenium.

4 votes

J'ai déjà utilisé ce site et l'empreinte digitale est identique à celle de mon navigateur normal. De plus, je n'automatise rien du tout. Je navigue simplement comme d'habitude.

4voto

PC3TJ Points 638

Écrivez une page html avec le code suivant. Vous verrez que dans le DOM, selenium applique un attribut webdriver dans le 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 votes

Cet attribut n'est ajouté que dans Firefox.

1 votes

Et il est possible de le supprimer de l'extension selenium qui contrôle le navigateur. Il fonctionnera de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X