Обнаружение честных веб-сканеров

Вопрос задан: 11 лет назад Последняя активность: 6 лет назад
up 36 down

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

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

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

6 ответов

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

Реклама

up 84 down

Вы сказали, что сопоставление пользовательского агента на «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 с lambda быстрее.
  • Убедитесь, что .ToLower() находится за пределами вашего метода linq - помните, что метод является циклом, и вы будете изменять строку во время каждой итерации.
  • Всегда ставьте самых тяжелых ботов в начале списка, чтобы они соответствовали раньше.
  • Поместите списки в статический класс, чтобы они не перестраивались при каждом просмотре страницы.

Honeypots

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

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

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

up 25 down accepted

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

up 9 down

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

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

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

up 5 down

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

up 4 down

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

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

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

up 0 down

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

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