ボットによるWebサーバーの停止を阻止する必要がある


9

ホスティングアカウント内のいくつかのWebサイトで、極端なボットの問題が発生しています。ボットは私のCPUリソースの98%以上と私のホスティングアカウント全体に私の帯域幅の99%を使用します。これらのボットは、私のサイトに対して1時間あたり1 GBを超えるトラフィックを生成しています。これらすべてのサイトの実際の人的トラフィ​​ックは100 MB /月未満です

これらのボットをブロックするためにrobots.txtと.htaccessファイルの両方で広範な調査を行いましたが、すべての方法が失敗しました。

robots.txtファイルにコードを入れてスクリプトディレクトリへのアクセスをブロックしましたが、これらのボット(Google、MS Bing、Yahoo)はルールを無視し、スクリプトを実行します。

Google、MS Bing、Yahooのボットを完全にブロックしたくないが、クロール速度を制限したい。また、robots.txtファイルにCrawl-delayステートメントを追加しても、ボットの速度は低下しません。すべてのサイトの現在のrobots.txtおよび.htaccesコードを以下に示します。

MicrosoftとGoogleの両方のウェブマスターツールを設定して、クロール速度を絶対最小に落としましたが、これらのサイトは10ヒット/秒の速度でヒットしています。

さらに、エラーの原因となるファイルをアップロードするたびに、VPS Webサーバー全体が数秒以内にダウンするため、これらのボットによる攻撃のせいでサイトにアクセスできず、問題を修正できません。

Webサイトへのトラフィックのスロットを停止するにはどうすればよいですか?

過去数か月間にこの問題についてWebホスティング会社(site5.com)に何度も質問してみましたが、彼らはこの問題を解決することができません。

ボットがrss2html.phpスクリプトを実行しないようにすることが本当に必要です。セッションとCookieの両方を試しましたが、どちらも失敗しました。

robots.txt

User-agent: Mediapartners-Google
Disallow: 
User-agent: Googlebot
Disallow: 
User-agent: Adsbot-Google
Disallow: 
User-agent: Googlebot-Image
Disallow: 
User-agent: Googlebot-Mobile
Disallow: 
User-agent: MSNBot
Disallow: 
User-agent: bingbot
Disallow: 
User-agent: Slurp
Disallow: 
User-Agent: Yahoo! Slurp
Disallow: 
# Directories
User-agent: *
Disallow: /
Disallow: /cgi-bin/
Disallow: /ads/
Disallow: /assets/
Disallow: /cgi-bin/
Disallow: /phone/
Disallow: /scripts/
# Files
Disallow: /ads/random_ads.php
Disallow: /scripts/rss2html.php
Disallow: /scripts/search_terms.php
Disallow: /scripts/template.html
Disallow: /scripts/template_mobile.html

.htaccess

ErrorDocument 400 http://english-1329329990.spampoison.com
ErrorDocument 401 http://english-1329329990.spampoison.com
ErrorDocument 403 http://english-1329329990.spampoison.com
ErrorDocument 404 /index.php
SetEnvIfNoCase User-Agent "^Yandex*" bad_bot
SetEnvIfNoCase User-Agent "^baidu*" bad_bot
Order Deny,Allow
Deny from env=bad_bot
RewriteEngine on
RewriteCond %{HTTP_user_agent} bot\* [OR]
RewriteCond %{HTTP_user_agent} \*bot
RewriteRule ^.*$ http://english-1329329990.spampoison.com [R,L]
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
# Block out any script that includes a <script> tag in URL
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Send all blocked request to homepage with 403 Forbidden error!
RewriteRule ^(.*)$ index.php [F,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
# Don't show directory listings for directories that do not contain an index file (index.php, default.asp etc.)
Options -Indexes
<Files http://english-1329329990.spampoison.com>
order allow,deny
allow from all
</Files>
deny from 108.
deny from 123.
deny from 180.
deny from 100.43.83.132

追加されたユーザーエージェントのBOTチェックコードを表示するための更新

<?php
function botcheck(){
 $spiders = array(
   array('AdsBot-Google','google.com'),
   array('Googlebot','google.com'),
   array('Googlebot-Image','google.com'),
   array('Googlebot-Mobile','google.com'),
   array('Mediapartners','google.com'),
   array('Mediapartners-Google','google.com'),
   array('msnbot','search.msn.com'),
   array('bingbot','bing.com'),
   array('Slurp','help.yahoo.com'),
   array('Yahoo! Slurp','help.yahoo.com')
 );
 $useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
 foreach($spiders as $bot) {
   if(preg_match("/$bot[0]/i",$useragent)){
     $ipaddress = $_SERVER['REMOTE_ADDR']; 
     $hostname = gethostbyaddr($ipaddress);
     $iphostname = gethostbyname($hostname);
     if (preg_match("/$bot[1]/i",$hostname) && $ipaddress == $iphostname){return true;}
   }
 }
}
if(botcheck() == false) {
  // User Login - Read Cookie values
     $username = $_COOKIE['username'];
     $password = $_COOKIE['password'];
     $radio_1 = $_COOKIE['radio_1'];
     $radio_2 = $_COOKIE['radio_2'];
     if (($username == 'm3s36G6S9v' && $password == 'S4er5h8QN2') || ($radio_1 == '2' && $radio_2 == '5')) {
     } else {
       $selected_username = $_POST['username'];
       $selected_password = $_POST['password'];
       $selected_radio_1 = $_POST['group1'];
       $selected_radio_2 = $_POST['group2'];
       if (($selected_username == 'm3s36G6S9v' && $selected_password == 'S4er5h8QN2') || ($selected_radio_1 == '2' && $selected_radio_2 == '5')) {
         setcookie("username", $selected_username, time()+3600, "/");
         setcookie("password", $selected_password, time()+3600, "/");
         setcookie("radio_1", $selected_radio_1, time()+3600, "/");
         setcookie("radio_2", $selected_radio_2, time()+3600, "/");
       } else {
        header("Location: login.html");
       }
     }
}
?>

rss2html.phpスクリプトの上部に以下を追加しました

// Checks to see if this script was called by the main site pages, (i.e. index.php or mobile.php) and if not, then sends to main page
   session_start();  
   if(isset($_SESSION['views'])){$_SESSION['views'] = $_SESSION['views']+ 1;} else {$_SESSION['views'] = 1;}
   if($_SESSION['views'] > 1) {header("Location: http://website.com/index.php");}

いつ更新しましたrobots.txtか?ロボットが更新バージョンを読み取るのに時間がかかる場合があります。
ilanco

数日前。ボットがrss2html.phpスクリプトを実行しないようにすることが本当に必要です。セッションとCookieの両方を試しましたが、どちらも失敗しました。

rss2html.phpあなたのサイトはどのように使用されていますか?PHPインクルード、リダイレクト、Ajaxを介して...?
cHao

rss2html.phpファイルは、file_get_contents()コマンドを介して呼び出されます

file_get_contents...?かなり奇妙に思えます。ファイルは別のサーバーか何かにありますか?
cHao 2012年

回答:


3

rss2html.phpがクライアントによって直接使用されていない場合(つまり、リンクなどではなく常にPHPを使用している場合)、ボットをブロックすることを忘れてください。あなたが本当にしなければならないのは、メインページで定数または何かを定義し、次にinclude他のスクリプトを定義することだけです。他のスクリプトで、定数が定義されているかどうかを確認し、403エラーや空白ページなど、定義されていない場合は吐き出します。

これが機能するためにincludefile_get_contents、ではなくを使用する必要があります。後者は単にファイルを読み込むか(ローカルパスを使用している場合)、または他のプロセス全体で実行するため( URLを使用します)。しかし、それはJoomlaのようなものです!スクリプトが直接含まれないようにするために使用します。また、URLではなくファイルパスを使用して、PHPコードを実行する前にPHPコードが解析されないようにします。

rss2html.phpドキュメントルートの下から移動することをお勧めしますが、一部のホストではこれを困難にしています。それがオプションかどうかは、サーバー/ホストの設定によって異なります。


1
チャオ、ありがとう。現在、代わりにfile_get_contentsをインクルードするようにコードを書き換えています。
サミー

4

ボットから提供されたユーザーエージェント文字列に基づいて404エラーをスローするようにスクリプトを設定することもできます。ボットはすぐにヒントを取得し、そのままにしておきます。

if(isset($_SERVER['HTTP_USER_AGENT'])){
   $agent = $_SERVER['HTTP_USER_AGENT'];
}

if(preg_match('/^Googlebot/i',$agent)){
   http_response_code(301);
   header("HTTP/1.1 301 Moved Permanently");
   header("Location: http://www.google.com/");
   exit;
}

同様の方法でログを選択し、Bingbotなどを拒否します。リクエストは停止されませんが、帯域幅が節約される可能性があります。Googlebotに独自の薬の味を与えてください-Mwhahahahaha!

更新しました

あなたのコードを見て、私はあなたの問題がここにあると思います:

if (preg_match("/$bot[1]/i",$hostname) && $ipaddress == $iphostname)

それらが悪意のあるボットである場合、それらはどこから来ている可能性があり、その$ipaddress句を取り除き、301または404応答をスローします。

箱の横で考えて

  1. GooglebotはCookieを受け入れないため、Cookieを保存できません。実際、すべてのユーザーにCookieが必要な場合は、ボットがページにアクセスできないようにする可能性があります。
  2. GooglebotはフォームやJavaScriptを認識しないため、リンクを動的に生成したり、ユーザーにボタンをクリックして(適切なトークンを添付して)コードにアクセスさせたりすることができます。

    <a href="#" onclick="document.location='rss2html.php?validated=29e0-27fa12-fca4-cae3';">Rss2html.php</a>

    • rss2html.php?validated = 29e0-27fa12-fca4-cae3-人間
    • rss2html.php-ボット

1
思ったほど速くはありません。ボットが同じ存在しないページに数か月、場合によってはページが削除されてから数年たっても、目にすることがあります。ボットの動作の良し悪し、その後のボットに依存します。
cHao 2012年

人間の訪問者が機能する方法は、index.phpファイルがrss2html.phpスクリプトを呼び出すことです。ボットはindex.phpスクリプトを回避し、rss2html.phpスクリプトを直接実行します。index.phpスクリプトを介してアクセスされなかった場合、そのrss2html.phpファイルをどのように保護できますか?

rss2html.phpを別の名前に変更し、新しい名前を参照するようにindex.phpを更新してみてください。
BluesRockAddict 2012年

ファイルの名前を変更しようとしましたが、数日後に失敗します。使用しているコードをこのスレッドに追加するにはどうすればよいですか?私が試したことをお見せしたいと思います。

1
わかりました-私はあなたが引っ張ることができるトリックを知っています:)-rss2html.phpスクリプトコードをあなたのウェブサイトの外に置きます(答えを更新します)

2

スパイダー/ボット/クライアントなどに対するPHP制限/ Webサイトリクエストのブロック

ここでは、不要なリクエストをブロックしてWebサイトのトラフィックを削減できるPHP関数を作成しました。スパイダー、ボット、迷惑なクライアントに適しています。

クライアント/ボットブロッカー

デモ: http : //szczepan.info/9-webdesign/php/1-php-limit-block-website-requests-for-spiders-bots-clients-etc.html

コード:

/* Function which can Block unwanted Requests
 * @return array of error messages
 */
function requestBlocker()
{
        /*
        Version 1.0 11 Jan 2013
        Author: Szczepan K
        http://www.szczepan.info
        me[@] szczepan [dot] info
        ###Description###
        A PHP function which can Block unwanted Requests to reduce your Website-Traffic.
        God for Spiders, Bots and annoying Clients.

        */

        # Before using this function you must 
        # create & set this directory as writeable!!!!
        $dir = 'requestBlocker/';

        $rules   = array(
                #You can add multiple Rules in a array like this one here
                #Notice that large "sec definitions" (like 60*60*60) will blow up your client File
                array(
                        //if >5 requests in 5 Seconds then Block client 15 Seconds
                        'requests' => 5, //5 requests
                        'sek' => 5, //5 requests in 5 Seconds
                        'blockTime' => 15 // Block client 15 Seconds
                ),
                array(
                        //if >10 requests in 30 Seconds then Block client 20 Seconds
                        'requests' => 10, //10 requests
                        'sek' => 30, //10 requests in 30 Seconds
                        'blockTime' => 20 // Block client 20 Seconds
                ),
                array(
                        //if >200 requests in 1 Hour then Block client 10 Minutes
                        'requests' => 200, //200 requests
                        'sek' => 60 * 60, //200 requests in 1 Hour
                        'blockTime' => 60 * 10 // Block client 10 Minutes
                )
        );
        $time    = time();
        $blockIt = array();
        $user    = array();

        #Set Unique Name for each Client-File 
        $user[] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'IP_unknown';
        $user[] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
        $user[] = strtolower(gethostbyaddr($user[0]));

        # Notice that I use files because bots do not accept Sessions
        $botFile = $dir . substr($user[0], 0, 8) . '_' . substr(md5(join('', $user)), 0, 5) . '.txt';


        if (file_exists($botFile)) {
                $file   = file_get_contents($botFile);
                $client = unserialize($file);

        } else {
                $client                = array();
                $client['time'][$time] = 0;
        }

        # Set/Unset Blocktime for blocked Clients
        if (isset($client['block'])) {
                foreach ($client['block'] as $ruleNr => $timestampPast) {
                        $elapsed = $time - $timestampPast;
                        if (($elapsed ) > $rules[$ruleNr]['blockTime']) {
                                unset($client['block'][$ruleNr]);
                                continue;
                        }
                        $blockIt[] = 'Block active for Rule: ' . $ruleNr . ' - unlock in ' . ($elapsed - $rules[$ruleNr]['blockTime']) . ' Sec.';
                }
                if (!empty($blockIt)) {
                        return $blockIt;
                }
        }

        # log/count each access
        if (!isset($client['time'][$time])) {
                $client['time'][$time] = 1;
        } else {
                $client['time'][$time]++;

        }

        #check the Rules for Client
        $min = array(
                0
        );
        foreach ($rules as $ruleNr => $v) {
                $i            = 0;
                $tr           = false;
                $sum[$ruleNr] = 0;
                $requests     = $v['requests'];
                $sek          = $v['sek'];
                foreach ($client['time'] as $timestampPast => $count) {
                        if (($time - $timestampPast) < $sek) {
                                $sum[$ruleNr] += $count;
                                if ($tr == false) {
                                        #register non-use Timestamps for File 
                                        $min[] = $i;
                                        unset($min[0]);
                                        $tr = true;
                                }
                        }
                        $i++;
                }

                if ($sum[$ruleNr] > $requests) {
                        $blockIt[]                = 'Limit : ' . $ruleNr . '=' . $requests . ' requests in ' . $sek . ' seconds!';
                        $client['block'][$ruleNr] = $time;
                }
        }
        $min = min($min) - 1;
        #drop non-use Timestamps in File 
        foreach ($client['time'] as $k => $v) {
                if (!($min <= $i)) {
                        unset($client['time'][$k]);
                }
        }
        $file = file_put_contents($botFile, serialize($client));


        return $blockIt;

}


if ($t = requestBlocker()) {
        echo 'dont pass here!';
        print_R($t);
} else {
        echo "go on!";
}

1

サイトが偽のGoogleボットによってインデックスに登録されている可能性があります。チェックを追加して、すべての偽のGoogleボットリクエストに対して404を提供することができます。

Googlebotの確認方法を説明する記事は次のとおりです:http : //googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

また、既知の偽のボットに対してレコードをチェックすることもできます:http : //stopmalvertising.com/security/fake-google-bots.html


おかげで、実際には私も試しました。ユーザーエージェントを特定し、ボットをログインページに送信しました。これも失敗しました。

要点を見逃しているようです。ボットの信頼性を判断するためにユーザーエージェントに依存するだけでは十分ではありません。
BluesRockAddict 2012年

1

最初に、ユーザーエージェントからリクエストされたページのうち、悪用されているクローラーのページに静的ページが提供されるようにする必要があります。

条件付きのApache mod_rewriteまたはhttpサーバーと同等。Apacheの場合、このようなもの:

RewriteCond  %{HTTP_USER_AGENT}  ^GoogleBot [OR]
RewriteCond  %{HTTP_USER_AGENT}  ^OtherAbusiveBot
RewriteRule  ^/$                 /static_page_for_bots.html  [L]

おかげで、Google、MS Bing、Yahooボットを完全にブロックしたくありませんが、rss2html.phpスクリプトファイルへの直接のヒットを制限したいと思います。rss2html.phpスクリプトの先頭に何かを追加するだけで、index.phpスクリプトからアクセスされなかった場合に実行されなくなります。ボットは現在、index.phpファイルをバイパスしてrss2html.phpスクリプトを実行しています。
サミー

これはそれらをブロックしません.. phpのキャッシュされたバージョンを提供するだけです。これはサーバーが行うことは非常に簡単で、1つのphpインスタンス/ 1つのapache子プロセスです。=>コスト(静的ファイル)<コスト(phpインスタンス)。
smassey

どのようにページをキャッシュしますか?ページはRSSなので、キャッシュページは頻繁に更新され、新しいデータを提供できますか?
サミー

もちろん...あなたのためにそれをするcronjobを書いてください。ページを1分間キャッシュした場合にサーバーが10req / sにヒットしたとすると、サーバーに599の追加のphpインスタンスが保存されています(確かにdb接続/クエリが含まれます)。のため:10/15分。
smassey

1

smasseyの投稿を続けるには、いくつかの条件を設定できます。

RewriteCond  %{HTTP_USER_AGENT}  ^GoogleBot [OR]
RewriteCond  %{HTTP_USER_AGENT}  ^OtherAbusiveBot
RewriteRule  ^rss2html\.php$     /static.html  [L]

このようにして、ボットは引き続きページにアクセスしますが、そうではありません。(正当な)ボットがルールを守っていないのは奇妙なので、他のソース(ドメイン名転送など)からボットをページにプッシュするリファラーはありますか?


1

http://perishablepress.com/blackhole-bad-bots/にあるスクリプトで同じ問題を解決しました。このブラックホールアプローチで悪意のあるIPのリストを収集し、.htaccessを使用してそれらを拒否しました。(これは必須ではありません。スクリプト自体が禁止を行うためです。しかし、既知の不要なIPのphp解析を回避することでサーバーの負荷を減らす必要があります)3日間で、トラフィックは1日あたり5 GBから300 MBに減少しました。

多くの既知のジャンクボットをブロックするhtaccessルールの完全なリストについては、このページも確認してください。http://www.askapache.com/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html


0
// Checks to see if this script was called by the main site pages,
// (i.e. index.php or mobile.php) and if not, then sends to main page
session_start();  
if (isset($_SESSION['views'])) {$_SESSION['views'] = $_SESSION['views']+ 1;} else {$_SESSION['views'] = 1;}
if ($_SESSION['views'] > 1) {header("Location: http://website.com/index.php");}

このスクリプトは、コメントが言うことを実行しません。実際、それは完全に反対です。ボットがスクリプトを要求したときにセッション変数が設定されることはないため、これによりボットは常に通過します。可能性があるのは、(index.phpまたはmobile.phpからの)正当なリクエストがスクリプトを複数回呼び出すのを防ぐことだけです。

ボットがスクリプトにアクセスできないようにするには、セッション変数(またはCookie)が実際に設定されている場合にのみアクセスを許可する必要があります。もちろん、(悪意のある)ボットがCookieを受け入れないと仮定します。(実際のGooglebotはそうではないことを知っています。)

すでに述べたように、rss2html.phpをWebルートの上(パブリックWebスペースの外)に配置すると、ボットがスクリプトに直接アクセスできなくなりますが、これにより他の問題が発生するとお考えですか?または、それをディレクトリに配置し、そのディレクトリを.htaccessで保護します。または、直接リクエストから.htaccess内のファイル自体を保護することさえできるでしょうか?


0

Cloudflareにドメインをセットアップします(このための無料サービス)。悪意のあるボットがサーバーに到達する前に、ドメインレベルでブロックします。約20分かかります。コードを確認する必要はありません。

私はすべてのサイトとすべてのクライアントサイトでこのサービスを使用しています。彼らは、プロジェクトのハニーポットの活用など、いくつかの手法に基づいて悪意のあるボットを特定します。


0

apache / nginx / email / ftp用のサーバーにSSL証明書をインストールする必要があります。HSTSを有効にし、SSLv2 SSLv3 TLSv1が無効になり、着信接続を許可しないようにssl.confファイルを編集する必要もあります。サーバーを適切に強化すれば、ボットによる問題は発生しません。


この場合、SSL / TLSがどのような問題を解決しているかははっきりしません。質問をして結果にたどり着いたようです。このソリューションが問題をどのように制御するか説明してください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.