Потрібно зупинити ботів від вбивства мого веб-сервера


9

У мене виникають проблеми з ботом EXTREME на деяких моїх веб-сайтах в моєму хостинг-акаунті. Боти використовують понад 98% моїх ресурсів процесора та 99% моєї пропускної здатності для всього мого облікового запису хостингу. Ці боти генерують понад 1 ГБ трафіку на годину для моїх сайтів. Реальний людський трафік для всіх цих сайтів становить менше 100 Мб / місяць .

Я провів великі дослідження як файлів robots.txt, так і файлу .htaccess для блокування цих ботів, але всі методи не вдалися.

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

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

У мене є налаштування як Microsoft, так і інструментів для веб-майстрів Google, щоб уповільнити швидкість сканування до абсолютного мінімуму, але вони все ще потрапляють на ці сайти зі швидкістю 10 звернень / секунду.

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

Що я можу зробити, щоб зупинити рух трафіку на своїх веб-сайтах?

Упродовж останніх місяців я багато разів намагався запитати у своєї веб-хостингової компанії (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

ОНОВЛЕНО ДЛЯ ПОКАЗУВАННЯ ДОБАВЛЕНОГО АГЕНТА КОРИСТУВАЧА БОЛЬКИ ПЕРЕВІРИТИ КОД

<?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

Відповіді:


3

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

Тепер, для того, щоб це працювало, вам доведеться includeскоріше використовувати , ніж file_get_contentsостанній буде просто читати у файлі (якщо ви використовуєте локальний шлях), або запускатись у цілому іншому процесі (якщо ви повторно за допомогою URL-адреси). Але це такий метод, як Joomla! використовує для запобігання прямому включенню сценарію. І використовуйте шлях до файлу, а не URL-адресу, щоб PHP-код уже не був розбір, перш ніж спробувати запустити його.

Ще краще було б rss2html.phpвийти з-під кореня документа, але деякі хости це зробити важко. Чи це варіант, залежить від налаштування вашого сервера / хоста.


1
Чао, дякую. В даний час я переписую свій код для перетворення файлу_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. Googlebot не розуміє форм - або - javascript, тому ви можете динамічно генерувати свої посилання або змусити користувачів натиснути кнопку, щоб дійти до вашого коду (із доданим відповідним маркером).

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

    • rss2html.php? перевірено = 29e0-27fa12-fca4-cae3 - людина
    • rss2html.php - бот

1
Не так швидко, як ви могли подумати. Я бачив, як боти потрапляли на одну і ту ж неіснуючу сторінку місяцями, іноді навіть роками після видалення сторінки. Залежить від того, наскільки добре поводиться бот і що він після цього.
cHao

Спосіб роботи для людських відвідувачів полягає в тому, що файл index.php викликає скрипт rss2html.php. Боти уникають скрипта index.php і безпосередньо запускають сценарій rss2html.php. Як я можу захистити цей файл rss2html.php, якщо він не був доступний через скрипт index.php?

Спробуйте перейменувати rss2html.php на щось інше та оновіть index.php, щоб вказати нове ім'я.
BluesRockAddict

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

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

2

PHP Обмеження / Блокування запитів веб-сайтів для павуків / ботів / клієнтів тощо.

Тут я написав функцію PHP, яка може блокувати небажані запити, щоб зменшити ваш веб-трафік. Добре для павуків, ботів та дратівливих клієнтів.

КЛІЄНТ / Блокувальник ботів

DEMO: 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-серверу. Для апачу щось подібне:

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 ... це дуже легко для сервера todo, це один екземпляр менш php / один менш дочірній процес apache. => Вартість (статичний файл) <Вартість (екземпляр php).
smassey

як я б кешував сторінки? Оскільки сторінки є RSS, чи будуть кешовані сторінки оновлюватися досить часто, щоб забезпечити нові дані?
Семмі

Звичайно ... Напишіть кронштейн, який робить це за вас. Якщо ви скажете, що вони потрапляють на сервер 10req / s, якщо ви кешуєте сторінки за 1 хвилину, ви зберегли на своєму сервері 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, заперечував їх. (Що не є обов'язковим, оскільки сам сценарій виконує заборону. Але мені потрібно зменшити навантаження сервера, уникаючи розбору 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) фактично встановлена. Припустимо, звичайно, що (шкідливий) бот не приймає файли cookie. (Ми знаємо, що справжній Googlebot цього не робить.)

Як уже було сказано, розміщення 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.