Détecter les robots Web honnêtes

Je voudrais détecter (côté serveur) les requêtes qui proviennent de bots. Je me fiche des robots malveillants pour le moment, juste ceux qui jouent bien. J’ai déjà vu quelques approches qui consistent principalement à faire correspondre la chaîne de l’agent utilisateur à des mots clés tels que “bot”. Mais cela semble maladroit, incomplet et impossible à maintenir. Alors, est-ce que quelqu’un a des approches plus solides? Sinon, avez-vous des ressources que vous utilisez pour vous tenir au courant de tous les agents utilisateurs conviviaux?

Si vous êtes curieux: je n’essaie pas de faire quoi que ce soit contre les règles des moteurs de recherche. Nous avons une section du site où un utilisateur est présenté au hasard avec l’une de plusieurs versions légèrement différentes d’une page. Toutefois, si un robot d’indexation est détecté, nous lui atsortingbuerons toujours la même version pour que l’index soit cohérent.

J’utilise aussi Java, mais j’imagine que l’approche serait similaire pour toutes les technologies côté serveur.

Vous pouvez trouver une firebase database très complète sur les “bons” robots Web connus dans la firebase database de robotsststst.org. L’utilisation de ces données serait bien plus efficace que la simple mise en correspondance de bot dans l’agent utilisateur.

Vous avez dit que faire correspondre l’agent utilisateur sur “bot” peut être gênant, mais nous avons trouvé que c’était un très bon match. Nos études ont montré qu’il couvrirait environ 98% des hits que vous recevrez. Nous n’avons pas encore rencontré de faux résultats positifs non plus. Si vous souhaitez augmenter ce pourcentage à 99,9%, vous pouvez inclure quelques autres matches connus, tels que “robot d’exploration”, “baiduspider”, “ia_archiver”, “curl”, etc. Nous l’avons testé sur nos systèmes de production sur des millions des hits.

Voici quelques solutions c # pour vous:

1) le plus simple

Est le plus rapide lors du traitement d’un échec. c’est-à-dire le trafic d’un non-bot – un utilisateur normal. Prend 99 +% des chenilles.

bool iscrawler = Regex.IsMatch(Request.UserAgent, @"bot|crawler|baiduspider|80legs|ia_archiver|voyager|curl|wget|yahoo! slurp|mediapartners-google", RegexOptions.IgnoreCase); 

2) moyen

Est le plus rapide lors du traitement d’un hit. c’est à dire le trafic d’un bot. Assez rapide pour les miss aussi. Prend près de 100% des chenilles. Correspondances ‘bot’, ‘crawler’, ‘spider’ dès le départ. Vous pouvez y append tout autre robot d’exploration connu.

 List Crawlers3 = new List() { "bot","crawler","spider","80legs","baidu","yahoo! slurp","ia_archiver","mediapartners-google", "lwp-sortingvial","nederland.zoek","ahoy","anthill","appie","arale","araneo","ariadne", "atn_worldwide","atomz","bjaaland","ukonline","calif","combine","cosmos","cusco", "cyberspyder","digger","grabber","downloadexpress","ecollector","ebiness","esculapio", "esther","felix ide","hamahakki","kit-fireball","fouineur","freecrawl","desertrealm", "gcreep","golem","griffon","gromit","gulliver","gulper","whowhere","havindex","hotwired", "htdig","ingrid","informant","inspectorwww","iron33","teoma","ask jeeves","jeeves", "image.kapsi.net","kdd-explorer","label-grabber","larbin","linkidator","linkwalker", "lockon","marvin","mattie","mediafox","merzscope","nec-meshexplorer","udmsearch","moget", "motor","muncher","muninn","muscatferret","mwdsearch","sharp-info-agent","webmechanic", "netscoop","newscan-online","objectssearch","orbsearch","packrat","pageboy","parasite", "pasortingc","pegasus","phpdig","piltdownman","pimptrain","plumtreewebaccessor","getterrobo-plus", "raven","roadrunner","robbie","robocrawl","robofox","webbandit","scooter","search-au", "searchprocess","senrigan","shagseeker","site valet","skymob","slurp","snooper","speedy", "curl_image_client","suke","www.sygol.com","tach_bw","templeton","titin","topiclink","udmsearch", "urlck","valkyrie libwww-perl","verticrawl","victoria","webscout","voyager","crawlpaper", "webcatcher","thunderstone","webmoose","pagesinventory","webquest","webreaper", "webwalker","winona","occam","robi","fdse","jobo","rhcs","gazz","dwcp","yeti","fido","wlm", "wolp","wwwc","xget","legs","curl","webs","wget","sift","cmc" }; ssortingng ua = Request.UserAgent.ToLower(); bool iscrawler = Crawlers3.Exists(x => ua.Contains(x)); 

3) paranoïaque

Est assez rapide, mais un peu plus lent que les options 1 et 2. C’est le plus précis, et vous permet de maintenir les listes si vous le souhaitez. Vous pouvez maintenir une liste séparée de noms avec «bot» dans ceux-ci si vous avez peur des faux positifs à l’avenir. Si nous obtenons une correspondance courte, nous l’enregistrons et la vérifions pour un faux positif.

 // crawlers that have 'bot' in their useragent List Crawlers1 = new List() { "googlebot","bingbot","yandexbot","ahrefsbot","msnbot","linkedinbot","exabot","compspybot", "yesupbot","paperlibot","tweetmemebot","semrushbot","gigabot","voilabot","adsbot-google", "botlink","alkalinebot","araybot","undrip bot","borg-bot","boxseabot","yodaobot","admedia bot", "ezooms.bot","confuzzledbot","coolbot","internet cruiser robot","yolinkbot","diibot","musobot", "dragonbot","elfinbot","wikiobot","twitterbot","contextad bot","hambot","iajabot","news bot", "irobot","socialradarbot","ko_yappo_robot","skimbot","psbot","rixbot","seznambot","careerbot", "simbot","solbot","mail.ru_bot","spiderbot","blekkobot","bitlybot","techbot","void-bot", "vwbot_k","diffbot","friendfeedbot","archive.org_bot","woriobot","crystalsemanticsbot","wepbot", "spbot","tweetedtimes bot","mj12bot","who.is bot","psbot","robot","jbot","bbot","bot" }; // crawlers that don't have 'bot' in their useragent List Crawlers2 = new List() { "baiduspider","80legs","baidu","yahoo! slurp","ia_archiver","mediapartners-google","lwp-sortingvial", "nederland.zoek","ahoy","anthill","appie","arale","araneo","ariadne","atn_worldwide","atomz", "bjaaland","ukonline","bspider","calif","christcrawler","combine","cosmos","cusco","cyberspyder", "cydralspider","digger","grabber","downloadexpress","ecollector","ebiness","esculapio","esther", "fastcrawler","felix ide","hamahakki","kit-fireball","fouineur","freecrawl","desertrealm", "gammaspider","gcreep","golem","griffon","gromit","gulliver","gulper","whowhere","portalbspider", "havindex","hotwired","htdig","ingrid","informant","infospiders","inspectorwww","iron33", "jcrawler","teoma","ask jeeves","jeeves","image.kapsi.net","kdd-explorer","label-grabber", "larbin","linkidator","linkwalker","lockon","logo_gif_crawler","marvin","mattie","mediafox", "merzscope","nec-meshexplorer","mindcrawler","udmsearch","moget","motor","muncher","muninn", "muscatferret","mwdsearch","sharp-info-agent","webmechanic","netscoop","newscan-online", "objectssearch","orbsearch","packrat","pageboy","parasite","pasortingc","pegasus","perlcrawler", "phpdig","piltdownman","pimptrain","pjspider","plumtreewebaccessor","getterrobo-plus","raven", "roadrunner","robbie","robocrawl","robofox","webbandit","scooter","search-au","searchprocess", "senrigan","shagseeker","site valet","skymob","slcrawler","slurp","snooper","speedy", "spider_monkey","spiderline","curl_image_client","suke","www.sygol.com","tach_bw","templeton", "titin","topiclink","udmsearch","urlck","valkyrie libwww-perl","verticrawl","victoria", "webscout","voyager","crawlpaper","wapspider","webcatcher","thunderstone", "webmoose","pagesinventory","webquest","webreaper","webspider","webwalker","winona","occam", "robi","fdse","jobo","rhcs","gazz","dwcp","yeti","crawler","fido","wlm","wolp","wwwc","xget", "legs","curl","webs","wget","sift","cmc" }; ssortingng ua = Request.UserAgent.ToLower(); ssortingng match = null; if (ua.Contains("bot")) match = Crawlers1.FirstOrDefault(x => ua.Contains(x)); else match = Crawlers2.FirstOrDefault(x => ua.Contains(x)); if (match != null && match.Length < 5) Log("Possible new crawler found: ", ua); bool iscrawler = match != null; 

Remarques:

  • Il est tentant de continuer à append des noms à l'option 1 de regex. Mais si vous faites cela, cela ralentira. Si vous voulez une liste plus complète, linq avec lambda est plus rapide.
  • Assurez-vous que .ToLower () est en dehors de votre méthode linq - rappelez-vous que la méthode est une boucle et que vous modifieriez la chaîne à chaque itération.
  • Toujours mettre les bots les plus lourds au début de la liste, afin qu'ils correspondent plus tôt.
  • Placez les listes dans une classe statique afin qu'elles ne soient pas reconstruites à chaque vue de page.

Pots de miel

La seule vraie alternative à cela est de créer sur votre site un lien "pot de miel" que seul un bot atteindra. Vous enregistrez ensuite les chaînes de l'agent utilisateur qui ont atteint la page pot de miel dans une firebase database. Vous pouvez ensuite utiliser ces chaînes enregistrées pour classer les robots.

Postives: Cela correspond à des robots d' Postives: inconnus qui ne se déclarent pas.

Negatives: Tous les robots d'exploration ne creusent pas assez profondément pour accéder à tous les liens de votre site. Ils risquent donc de ne pas atteindre votre pot de miel.

Une suggestion est de créer une ancre vide sur votre page que seul un bot suivrait. Les utilisateurs normaux ne verraient pas le lien, laissant les araignées et les bots à suivre. Par exemple, une balise d’ancrage vide qui pointe vers un sous-dossier enregistrerait une demande d’obtention dans vos journaux …

  

De nombreuses personnes utilisent cette méthode lors de l’exécution d’un HoneyPot pour intercepter des robots malveillants qui ne suivent pas le fichier robots.txt. J’utilise la méthode de l’ancre vide dans une solution honeypot ASP.NET que j’ai écrite pour piéger et bloquer ces robots rampants …

Tout visiteur dont la page d’entrée est /robots.txt est probablement un bot.

Quelque chose de rapide et sale comme celui-ci pourrait être un bon début:

 return if request.user_agent =~ /googlebot|msnbot|baidu|curl|wget|Mediapartners-Google|slurp|ia_archiver|Gigabot|libwww-perl|lwp-sortingvial/i 

Remarque: code de rails, mais l’expression rationnelle est généralement applicable.

Je suis presque sûr qu’une grande partie des robots n’utilisent pas le fichier robots.txt, mais c’était ma première pensée.

Il me semble que le meilleur moyen de détecter un bot est de prévoir le temps entre les requêtes. Si le temps entre les requêtes est toujours rapide, il s’agit d’un bot.