Обнаружение честных веб-сканеров - PullRequest
35 голосов
/ 13 февраля 2009

Я хотел бы определить (на стороне сервера), какие запросы поступают от ботов. На данный момент меня не волнуют злобные боты, только те, которые хорошо играют. Я видел несколько подходов, которые в основном включают сопоставление строки пользовательского агента с ключевыми словами, такими как «бот». Но это кажется неловким, неполным и неосуществимым. Так есть ли у кого-нибудь более солидные подходы? Если нет, есть ли у вас ресурсы, которые вы используете, чтобы быть в курсе всех дружественных пользовательских агентов?

Если вам интересно: я не пытаюсь что-либо сделать против какой-либо политики поисковой системы. У нас есть раздел сайта, где пользователю случайным образом представлена ​​одна из нескольких слегка отличающихся версий страницы. Однако, если обнаружен веб-сканер, мы всегда предоставляем им одну и ту же версию, чтобы индекс был согласованным.

Также я использую Java, но я полагаю, что подход будет аналогичным для любой серверной технологии.

Ответы [ 6 ]

83 голосов
/ 26 января 2013

Вы сказали, что сопоставление пользовательского агента на «bot» может быть неловким, но мы нашли, что это довольно хорошее совпадение. Наши исследования показали, что он будет охватывать около 98% полученных вами хитов. Мы также еще не сталкивались с ложными положительными совпадениями. Если вы хотите повысить это до 99,9%, вы можете включить несколько других известных совпадений, таких как 'crawler', 'baiduspider', 'ia_archiver', 'curl' и т. Д. Мы протестировали это на наших производственных системах более миллиона хитов.

Вот несколько решений c # для вас:

1) Простейший

Самый быстрый при обработке промаха. то есть трафик от не-бота - обычный пользователь. Ловит 99% гусеничных.

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

2) Средний

Является самым быстрым при обработке удара. то есть трафик от бота. Довольно быстро для промахов тоже. Ловит близко к 100% гусениц. Совпадает с «бот», «гусеничный», «паук» заранее. Вы можете добавить к нему любые другие известные сканеры.

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) Параноик

Довольно быстро, но немного медленнее, чем варианты 1 и 2. Он наиболее точный и позволяет вести списки, если хотите. Вы можете вести отдельный список имен с «ботом», если боитесь ложных срабатываний в будущем. Если мы получаем короткое совпадение, мы регистрируем его и проверяем на наличие ложных срабатываний.

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

Примечания:

  • Соблазнительно просто продолжать добавлять имена в опцию regex 1. Но если вы сделаете это, это замедлится. Если вы хотите получить более полный список, тогда linq с лямбда быстрее.
  • Убедитесь, что .ToLower () находится за пределами вашего метода linq - помните, что метод является циклом, и вы будете изменять строку во время каждой итерации.
  • Всегда ставьте самых тяжелых ботов в начале списка, чтобы они соответствовали раньше.
  • Поместите списки в статический класс, чтобы они не перестраивались при каждом просмотре страницы.

Honeypots

Единственная реальная альтернатива этому - создать на своем сайте ссылку «honeypot», доступную только для бота. Затем вы регистрируете строки агента пользователя, которые попадают на страницу honeypot, в базу данных. Затем вы можете использовать эти зарегистрированные строки для классификации сканеров.

Postives: Будет соответствовать некоторым неизвестным сканерам, которые не объявляют себя.

Negatives: Не все сканеры копают достаточно глубоко, чтобы попасть по каждой ссылке на вашем сайте, и поэтому они могут не достичь вашей приманки.

25 голосов
/ 13 февраля 2009

Вы можете найти очень подробную базу данных об известных "хороших" веб-сканерах в robotstxt.org База данных роботов . Использование этих данных было бы намного эффективнее, чем просто сопоставление bot в пользовательском агенте.

9 голосов
/ 13 февраля 2009

Одним из предложений является создание пустого якоря на вашей странице, за которым будет следовать только бот. Обычные пользователи не увидят ссылку, оставляя за собой пауков и ботов. Например, пустой тег привязки, который указывает на подпапку, будет записывать запрос на получение в ваших журналах ...

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

Многие люди используют этот метод при запуске HoneyPot для отлова вредоносных ботов, которые не следуют за файлом robots.txt. Я использую метод пустого якоря в решении для приманки ASP.NET , которое я написал, чтобы перехватывать и блокировать этих жутких сканеров ...

5 голосов
/ 13 февраля 2009

Любой посетитель, чья страница входа /robots.txt, вероятно, является ботом.

4 голосов
/ 26 июня 2010

Что-то быстрое и грязное, как это, может быть хорошим началом:

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

Примечание: код rails, но обычно применяется регулярное выражение.

0 голосов
/ 21 августа 2012

Я уверен, что большая часть ботов не использует robots.txt, однако это была моя первая мысль.

Мне кажется, что лучший способ обнаружить бота - это время между запросами, если время между запросами постоянно быстрое, тогда это бот.

...