Wykrywanie uczciwych robotów internetowych

Chciałbym wykryć (po stronie serwera), które żądania są od botów. W tym momencie nie obchodzą mnie złośliwe boty, tylko te, które grają ładnie. Widziałem kilka podejść, które polegają głównie na dopasowaniu ciągu agenta użytkownika do słów kluczowych takich jak "bot". Ale to wydaje się niezręczne, niekompletne i niemożliwe do utrzymania. Czy ktoś ma bardziej solidne podejście? Jeśli nie, Czy masz jakieś zasoby, których używasz, aby być na bieżąco ze wszystkimi przyjaznymi agentami użytkowników?

Jeśli jesteś ciekawy: nie staram się robić nic wbrew wszelkim zasadom wyszukiwarek. Mamy sekcję witryny, w której użytkownik jest losowo prezentowany z jedną z kilku nieco różnych wersji strony. Jednak w przypadku wykrycia robota internetowego zawsze dajemy mu tę samą wersję, aby indeks był spójny.

Również używam Javy, ale wyobrażam sobie, że podejście byłoby podobne dla każdej technologii po stronie serwera.

Author: j0k, 2009-02-13

6 answers

Bardzo dokładną bazę danych o znanych" dobrych " crawlerach internetowych znajdziesz w robotstxt.org Baza robotów . Wykorzystanie tych danych byłoby o wiele bardziej efektywne niż dopasowanie bota W user-agencie.

 24
Author: Sparr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 02:12:00

Powiedziałeś, że dopasowanie agenta użytkownika na "bocie" może być niezręczne, ale okazało się, że jest to całkiem dobre dopasowanie. Nasze badania wykazały, że obejmie około 98% trafień, które otrzymujesz. Również nie natknęliśmy się na fałszywie dodatnie dopasowania jeszcze. Jeśli chcesz podnieść tę wartość do 99,9%, możesz dołączyć kilka innych znanych meczów, takich jak 'crawler', 'baiduspider', 'ia_archiver', 'curl' itp. Przetestowaliśmy to na naszych systemach produkcyjnych w milionach odsłon.

Oto kilka c# rozwiązania dla ciebie:

1) najprostszy

Jest najszybszy podczas przetwarzania miss. czyli ruch od nie-bota-normalnego użytkownika. Łapie 99+% gąsienic.

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

2) Medium

Jest najszybszy podczas przetwarzania trafienia. czyli ruch z bota. Całkiem szybko jak na pudła. Łapie blisko 100% pełzaczy. Pasuje do "bot", "crawler", "spider" z góry. Możesz dodać do niego inne znane gąsienice.

List<string> Crawlers3 = new List<string>()
{
    "bot","crawler","spider","80legs","baidu","yahoo! slurp","ia_archiver","mediapartners-google",
    "lwp-trivial","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",
    "patric","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","t-h-u-n-d-e-r-s-t-o-n-e","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"
};
string ua = Request.UserAgent.ToLower();
bool iscrawler = Crawlers3.Exists(x => ua.Contains(x));

3) Paranoid

Jest dość szybki, ale trochę wolniejszy niż opcje 1 i 2. Jest najdokładniejszy i pozwala na utrzymanie list, jeśli chcesz. Możesz zachować osobną listę nazw z "botem" w nich, jeśli obawiasz się fałszywych alarmów w przyszłości. Jeśli otrzymamy krótkie dopasowanie, rejestrujemy je i sprawdzamy pod kątem fałszywego wyniku.

// crawlers that have 'bot' in their useragent
List<string> Crawlers1 = new List<string>()
{
    "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<string> Crawlers2 = new List<string>()
{
    "baiduspider","80legs","baidu","yahoo! slurp","ia_archiver","mediapartners-google","lwp-trivial",
    "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","patric","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","t-h-u-n-d-e-r-s-t-o-n-e",
    "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"
};

string ua = Request.UserAgent.ToLower();
string 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;

Uwagi:

  • kuszące jest dodawanie nazw do wyrażenia regularnego 1. Ale jeśli to zrobisz, będzie wolniej. Jeśli chcesz mieć pełniejszą listę to linq z lambda jest szybciej.
  • upewnij się .ToLower() jest poza Twoją metodą linq-pamiętaj, że metoda jest pętlą i będziesz modyfikować łańcuch podczas każdej iteracji.
  • zawsze umieszczaj najcięższe boty na początku listy, więc pasują szybciej.
  • umieść listy w statycznej klasie, aby nie były przebudowywane na każdej stronie.

Honeypots

Jedyną realną alternatywą dla tego jest stworzenie linku "honeypot" na swojej stronie, który tylko bot będzie sięgnij. Następnie logujesz ciągi agenta użytkownika, które trafiają na stronę honeypot, do bazy danych. Następnie możesz użyć tych zalogowanych ciągów do klasyfikacji robotów indeksujących.

Postives: pasuje do niektórych nieznanych robotów, które się nie deklarują.

Negatives: nie wszystkie gąsienice kopią wystarczająco głęboko, aby trafić w każdy link w Twojej witrynie, więc mogą nie dotrzeć do twojego honeypot.

 80
Author: Dave Sumter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-26 10:55:53

Jedną z sugestii jest utworzenie pustej kotwicy na swojej stronie, którą podążałby tylko bot. Normalni użytkownicy nie zobaczyliby linku, zostawiając pająki i boty do śledzenia. Na przykład pusty znacznik kotwicy, który wskazuje na podfolder, zarejestruje żądanie get w dziennikach...

<a href="dontfollowme.aspx"></a>

Wiele osób używa tej metody podczas uruchamiania HoneyPot, aby złapać złośliwe boty, które nie podążają za robotami.plik txt. Używam metody empty anchor w ASP.NET honeypot solution napisałem do trap i zablokować te przerażające gąsienice...

 9
Author: Dscoduc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 02:18:43

Każdy odwiedzający, którego strona wejściowa to / roboty.txt to pewnie bot.

 5
Author: Sparr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 02:06:57

Coś szybkiego i brudnego jak to może być dobry początek:

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

Uwaga: kod rails, ale regex jest ogólnie stosowany.

 4
Author: Brian Armstrong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 22:43:04

Jestem pewien, że duża część botów nie używa robotów.txt, jednak to była moja pierwsza myśl.

Wydaje mi się, że najlepszym sposobem na wykrycie bota jest czas między żądaniami, jeśli czas między żądaniami jest konsekwentnie szybki, To jest to bot.

 0
Author: Stewart McKee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-21 07:57:13