web-dev-qa-db-ja.com

不正ボットを追跡して停止する方法

1つのサイトの帯域幅のほとんどが身元不明のボットによって消費されています。 AWSTATSによれば、今月は不明なロボット(「bot *」で識別)が164 GBを消費しました。

それに比べて、Googlebotは10 GBを消費し、訪問者(閲覧トラフィック)は25 GBを消費しました。これは、不正なボットが訪問者の帯域幅の6倍以上を消費していることを意味します。私が実行している他のサイト(約12個)では通常の比率は25%であるため、25GBの表示トラフィックでは、ボットは合計で約6GBを消費します。

したがって、質問は次のとおりです。どのボットがこの大量のリクエストを引き起こしているかを特定する方法と、有用な場合にそれらを停止または減速させる方法

明らかに、AdSense/DoubleClickボットを含むGooglebot、Yahoo Slurp、MSNBotなど、サイトを訪れるほとんどのボットは重要なので、すべてのボットをブロックすることはできません。

これを調査しているのは、帯域幅の制限に達し、ホストのCPU使用率を超えているため、通知が送信されたためです。

5
Itai
  1. アクセスした人のIPアドレスをキャプチャするページを作成します。それらのIPをブロックするhtaccessファイルに追加します。 ( ここの例を参照

  2. 1px透明画像を使用して、Webサイトのフッターにあるそのページにリンクします

  3. Robots.txtでそのページをブロックして、良いロボットが見つけられないようにします

注:優れたIPやユーザーエージェントをホワイトリストに登録することも良いアイデアですSearch Engine SpidersのIPアドレス

1
John Conde

PHP経由で不要なロボット/スパイダーの訪問者をブロックする

手順:

次のPHPコードをindex.phpファイルの先頭に配置します。

ここでのアイデアは、メインサイトのPHPホームページ(サイトのメインエントリポイント)にコードを配置することです。

URLを介して直接アクセスされる他のPHPファイル(PHPを含む、またはサポートタイプファイルを必要としない)がある場合は、それらのファイルの先頭にコードを配置します。ほとんどのPHPサイトおよびPHP CMSサイトでは、ルートのindex.phpファイルはサイトのメインエントリポイントであるファイルです。

サイト統計、つまりAWStatsは、不明なロボット(「ボット」の後にスペースまたは次の文字_ +:、。; /-が続く)でヒットを記録しますが、これらのボットは記録されます。サイトのコンテンツへのアクセスがブロックされました。

<?php
// ---------------------------------------------------------------------------------------------------------------

// Banned IP Addresses and Bots - Redirects banned visitors who make it past the .htaccess and or robots.txt files to an URL.
// The $banned_ip_addresses array can contain both full and partial IP addresses, i.e. Full = 123.456.789.101, Partial = 123.456.789. or 123.456. or 123.
// Use partial IP addresses to include all IP addresses that begin with a partial IP addresses. The partial IP addresses must end with a period.
// The $banned_bots, $banned_unknown_bots, and $good_bots arrays should contain keyword strings found within the User Agent string.
// The $banned_unknown_bots array is used to identify unknown robots (identified by 'bot' followed by a space or one of the following characters _+:,.;/\-).
// The $good_bots array contains keyword strings used as exemptions when checking for $banned_unknown_bots. If you do not want to utilize the $good_bots array such as
// $good_bots = array(), then you must remove the the keywords strings 'bot.','bot/','bot-' from the $banned_unknown_bots array or else the good bots will also be banned.
   $banned_ip_addresses = array('41.','64.79.100.23','5.254.97.75','148.251.236.167','88.180.102.124','62.210.172.77','45.','195.206.253.146');
   $banned_bots = array('.ru','AhrefsBot','crawl','crawler','DotBot','linkdex','majestic','meanpath','PageAnalyzer','robot','rogerbot','semalt','SeznamBot','spider');
   $banned_unknown_bots = array('bot ','bot_','bot+','bot:','bot,','bot;','bot\\','bot.','bot/','bot-');
   $good_bots = array('Google','MSN','bing','Slurp','Yahoo','DuckDuck');
   $banned_redirect_url = 'http://english-1329329990.spampoison.com';

// Visitor's IP address and Browser (User Agent)
   $ip_address = $_SERVER['REMOTE_ADDR'];
   $browser = $_SERVER['HTTP_USER_AGENT'];

// Declared Temporary Variables
   $ipfound = $piece = $botfound = $gbotfound = $ubotfound = '';

// Checks for Banned IP Addresses and Bots
   if($banned_redirect_url != ''){
     // Checks for Banned IP Address
        if(!empty($banned_ip_addresses)){
          if(in_array($ip_address, $banned_ip_addresses)){$ipfound = 'found';}
          if($ipfound != 'found'){
            $ip_pieces = explode('.', $ip_address);
            foreach ($ip_pieces as $value){
              $piece = $piece.$value.'.';
              if(in_array($piece, $banned_ip_addresses)){$ipfound = 'found'; break;}
            }
          }
          if($ipfound == 'found'){header("location: $banned_redirect_url"); exit();}
        }

     // Checks for Banned Bots
        if(!empty($banned_bots)){
          foreach ($banned_bots as $bbvalue){
            $pos1 = stripos($browser, $bbvalue);
            if($pos1 !== false){$botfound = 'found'; break;}
          }
          if($botfound == 'found'){header("location: $banned_redirect_url"); exit();}
        }

     // Checks for Banned Unknown Bots
        if(!empty($good_bots)){
          foreach ($good_bots as $gbvalue){
            $pos2 = stripos($browser, $gbvalue);
            if($pos2 !== false){$gbotfound = 'found'; break;}
          }
        }
        if($gbotfound != 'found'){
          if(!empty($banned_unknown_bots)){
            foreach ($banned_unknown_bots as $bubvalue){
              $pos3 = stripos($browser, $bubvalue);
              if($pos3 !== false){$ubotfound = 'found'; break;}
            }
            if($ubotfound == 'found'){header("location: $banned_redirect_url"); exit();}
          }
        }
   }

// ---------------------------------------------------------------------------------------------------------------
?>
0
Sammy