• Форум посвящен самостоятельной (бесплатной) защите от ддос атак.
    Есть мануалы по настройке сервера от Ddos для сисадминов и готовые инструменты от ддос-атак для вебмастеров.

    Простое, эффективное, точное и проверенное бесплатное решение от мощных ддос-атак: PHP скрипт + Cloudflare, с панелью управления.

PHP скрипт для определения поисковых ботов

admin

admin

Администратор
Администрация
#1
Самый простой способ отличить поисковых ботов от ддос-ботов - по User Agent.

Простейший скрипт для определения ботов поисковиков.
PHP:
function isSearchBot()
{
  $bots = array('Google','Yandex','mail.ru','Rambler','yahoo.com','msn.com','bing.com'); // Посмотрите статистику и уберите ненужные вам поисковые системы, это уменьшит нагрузку

  foreach($bots as $b) { if( strpos($_SERVER['HTTP_USER_AGENT'], $b) == true ) return $b; }

  return false;
}
Но ддос боты могут выдавать себя за поисковых ботов, если ддосер поймет, что поискового бота вы определяете только по User Agent. Тогда нам поможет php-функция gethostbyaddr.

С проверкой Рамблер и Yahoo ботов есть проблемы, поэтому их убрал.
PHP:
function isSearchBot()
{
  $bots = array('Google'=>array('.googlebot.com', '.google.com'), 'Yandex'=>array('.yandex.com', '.yandex.ru', '.yandex.net'), 'mail.ru'=>array('.mail.ru'), 'msn.com'=>array('.msn.com'), 'bing.com'=>array('.msn.com'));

  foreach($bots as $u=>$h)
  {
      if( strpos($_SERVER['HTTP_USER_AGENT'], $u) == true )
      {
         $iphost=gethostbyaddr($_SERVER['REMOTE_ADDR']);
      
         foreach($h as $host)
         {
             if (substr($iphost, -strlen($host) )==$host) return true;
         }
   
         return 'фейковый бот';
     }  
  }

  return 'не бот';
}
Функция gethostbyaddr медленная, поэтому нам нужно будет сохранять результат проверки. Рекомендую создавать файлы с именем ip адреса для "хороших" и "плохих" ботов. Например, так.
PHP:
if (!file_exists('search/'.$_SERVER['REMOTE_ADDR']))
{
  $isbot= isSearchBot(); // Проверяем на бота
  file_put_contents('search/'.$_SERVER['REMOTE_ADDR'], $isbot); // Записываем результат
}
else $isbot=file_get_contents('search/'.$_SERVER['REMOTE_ADDR']);
Вы можете сделать для хороших и плохих ботов разные папки, в общем принцип понятен.

Акуальный список User Agent ботов Яндекса смотрите здесь.
Акуальный список User Agent ботов Гугла смотрите здесь.

Примеры User Agent других поисковых ботов.
Код:
Mail.ru
Mozilla/5.0 (compatible; Mail.RU_Bot/Fast/2.0)

Rambler
StackRambler/2.0 (MSIE incompatible)
StackRambler/2.0

Yahoo
Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)

MSN
msnbot/1.1 (+http://search.msn.com/msnbot.htm)
msnbot-media/1.0 (+http://search.msn.com/msnbot.htm)
msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)
msnbot-news (+http://search.msn.com/msnbot.htm)

Bing
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
 
Последнее редактирование:
admin

admin

Администратор
Администрация
#2
По сети гуляет скрипт со следующим набором поисковых ботов.
Код:
$bots = array(
            'rambler','googlebot','aport','yahoo','msnbot','turtle','mail.ru','omsktele',
            'yetibot','picsearch','sape.bot','sape_context','gigabot','snapbot','alexa.com',
            'megadownload.net','askpeter.info','igde.ru','ask.com','qwartabot','yanga.co.uk',
            'scoutjet','similarpages','oozbot','shrinktheweb.com','aboutusbot','followsite.com',
            'dataparksearch','google-sitemaps','appEngine-google','feedfetcher-google',
            'liveinternet.ru','xml-sitemaps.com','agama','metadatalabs.com','h1.hrn.ru',
            'googlealert.com','seo-rus.com','yaDirectBot','yandeG','yandex',
            'yandexSomething','Copyscape.com','AdsBot-Google','domaintools.com',
            'Nigma.ru','bing.com','dotnetdotcom'
    );
Он не актуален!
 
admin

admin

Администратор
Администрация
#3
Как вариант, можно разделить на две отдельные функции.
PHP:
function isBot()
{
  $bots = array('Google','Yandex','mail.ru','msn.com','bing.com'); 
  
  foreach($bots as $b) { if( strpos($_SERVER['HTTP_USER_AGENT'], $b) !== false ) return $b; }
  
  return false;
}

function checkBot($search)
{
  $bots = array('Google'=>array('.googlebot.com'), 'Yandex'=>array('.yandex.com', '.yandex.ru', '.yandex.net'), 'mail.ru'=>array('.mail.ru'), 'msn.com'=>array('.msn.com'), 'bing.com'=>array('.msn.com')); 
  
  if (!isset($bots[$search])) return true;
  
  $iphost=gethostbyaddr($_SERVER['REMOTE_ADDR']);
        
  foreach($bots[$search] as $host) 
  {
    if (substr($iphost, -strlen($host) )==$host) return true;
  }

  return false;
}
 
Сверху