Нужно остановить ботов от убийства моего веб-сервера


9

У меня очень серьезные проблемы с ботами на некоторых моих сайтах в моей учетной записи хостинга. Боты используют более 98% ресурсов моего процессора и 99% пропускной способности для всей моей учетной записи хостинга. Эти боты генерируют более 1 ГБ трафика в час для моих сайтов. Реальный человеческий трафик для всех этих сайтов составляет менее 100 МБ / месяц .

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

Я также поместил код в файлы robots.txt, чтобы заблокировать доступ к каталогам сценариев, но эти боты (Google, MS Bing и Yahoo) игнорируют правила и в любом случае запускают сценарии.

Я не хочу полностью блокировать роботов Google, MS Bing и Yahoo, но хочу ограничить скорость сканирования. Кроме того, добавление оператора Crawl-delay в файл robots.txt не замедляет работу ботов. Мои текущие коды robots.txt и .htacces для всех сайтов указаны ниже.

Я настроил инструменты Microsoft и Google для веб-мастеров, чтобы снизить скорость сканирования до абсолютного минимума, но они по-прежнему используют эти сайты со скоростью 10 посещений в секунду.

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

Что я могу сделать, чтобы остановить трафик на мои сайты?

В последние месяцы я много раз пытался спросить мою веб-хостинговую компанию (site5.com) об этой проблеме, и они не могут помочь мне с этой проблемой.

Что мне действительно нужно, так это запретить ботам запускать скрипт rss2html.php. Я пробовал обе сессии и куки, и оба не удалось.

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 CHECK CODE

<?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. Я пробовал обе сессии и куки, и оба не удалось.

Как rss2html.phpиспользуется ваш сайт? через PHP включить, перенаправить, Ajax ....?
cHao

Файлы rss2html.php вызываются с помощью команды file_get_contents ()

file_get_contents...? Кажется довольно странным. Файл находится на другом сервере или что-то?
Цао

Ответы:


3

Если rss2html.phpклиент не использует его напрямую (то есть, если PHP всегда использует его, а не ссылку или что-то в этом роде), тогда забудьте о попытке заблокировать ботов. Все, что вам действительно нужно сделать, это определить константу или что-то на главной странице, а затем includeдругой скрипт. В другом сценарии проверьте, определена ли константа, и выдайте ошибку 403 или пустую страницу или что-то еще, если она не определена.

Теперь, чтобы это работало, вам придется использовать includeвместо file_get_contents, так как последний будет либо просто читать в файле (если вы используете локальный путь), либо запускаться в совершенно другом процессе (если вы использовать URL). Но это такой метод, как Joomla! используется для предотвращения непосредственного включения сценария. И используйте путь к файлу, а не URL, чтобы код 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 для всех пользователей, это, вероятно, помешает боту получить доступ к вашей странице.
  2. Робот Google не понимает формы или 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
Не так быстро, как вы думаете. Я видел, как боты заходили на одну и ту же несуществующую страницу месяцами, иногда даже спустя годы после удаления страницы. Зависит от того, насколько хорошо вел себя бот и что ему после.
Цао

Для посетителей-людей работает то, что файл index.php вызывает скрипт rss2html.php. Боты избегают сценария index.php и напрямую запускают сценарий rss2html.php. Как я могу защитить этот файл rss2html.php, если он не был доступен через скрипт index.php?

Попробуйте переименовать rss2html.php во что-то другое и обновите ваш index.php для ссылки на новое имя.
BluesRockAddict

Я попытался переименовать файл, но он потерпел неудачу через несколько дней. Как я могу добавить код, который я использую в этой теме? Я хочу показать вам, что я пытался.

1
хорошо - я знаю хитрость, которую вы можете использовать :) - поместите код скрипта rss2html.php за пределы вашего сайта (

2

Ограничение PHP / блокировка запросов веб-сайтов для пауков / ботов / клиентов и т. Д.

Здесь я написал функцию PHP, которая может блокировать нежелательные запросы, чтобы уменьшить трафик вашего сайта. Хорошо для пауков, ботов и раздражающих клиентов.

КЛИЕНТ / Bots Blocker

ДЕМО: 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. Вы можете попробовать добавить чек и обслуживать 404 для всех поддельных запросов ботов Google.

Вот статья, которая объясняет, как проверить Googlebot: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Также вы можете проверить свои записи по известным поддельным ботам: http://stopmalvertising.com/security/fake-google-bots.html


Спасибо, но на самом деле я тоже это попробовал, определив пользовательских агентов и отправив ботов на страницу входа. Это также не удалось.

Похоже, вы упускаете суть - полагаться на агента пользователя для определения подлинности бота недостаточно.
BluesRockAddict

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. В настоящее время боты запускают скрипт rss2html.php, минуя файл index.php.
Сэмми

Это не блокирует их ... вы просто обслуживаете кэшированную версию своего php .. это очень легко сделать для сервера, это на один экземпляр php меньше / на один дочерний процесс apache. => Стоимость (статический файл) <Стоимость (экземпляр php).
smassey

как бы я кешировал страницы? Поскольку страницы являются RSS, будут ли кэшированные страницы обновляться достаточно часто для предоставления свежих данных?
Сэмми

Конечно ... Напишите cronjob, который сделает это за вас. Если вы говорите, что они достигают сервера 10req / s, если вы кэшируете страницы в течение 1 минуты, вы сохранили на своем сервере 599 дополнительных экземпляров php (которые, безусловно, включают соединения / запросы БД). И раз в минуту это намного больше, чем я бы проголосовал для: 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, запретил их. (Это не является обязательным, поскольку сам скрипт выполняет запрет. Но мне нужно уменьшить нагрузку на сервер, избегая разбора php для известных нежелательных ips), за три дня мой трафик снизился с 5 ГБ в день до 300 МБ, что вполне ожидаемо.

Проверьте эту страницу также для полного списка правил 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) действительно установлена. Предполагая, конечно, что (злонамеренный) бот не принимает куки. (Мы знаем, что настоящий робот Google не делает.)

Как уже упоминалось, размещение файла rss2html.php над корневым веб-сайтом (вне общедоступного веб-пространства) не позволит боту напрямую получить доступ к сценарию - но вы говорите, что это вызывает другие проблемы? Или поместите его в каталог и защитите этот каталог с помощью .htaccess. Или вы можете даже защитить сам файл в .htaccess от прямых запросов?


0

Настройте свой домен на Cloudflare (бесплатный сервис для этого). Они блокируют вредоносных ботов на уровне домена, прежде чем они попадают на ваш сервер. Занимает около 20 минут, никогда не надо махать с кодом.

Я использую этот сервис на всех своих сайтах и ​​на всех клиентских сайтах. Они выявляют вредоносных ботов на основе ряда методов, включая использование проекта Honey pot.


0

Что вам нужно сделать, это установить сертификат SSL на вашем сервере для apache / nginx / email / ftp. Включите HSTS, а также вам нужно отредактировать файл ssl.conf, чтобы SSLv2 SSLv3 TLSv1 были отключены и не разрешали входящие подключения. Укрепите свой сервер правильно, и у вас не будет проблем с ботами.


Мне не ясно, какую проблему SSL / TLS решает в этом случае. Похоже, вы задаете вопрос и достигаете результата. Пожалуйста, объясните, как это решение контролирует проблему.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.