Muszę powstrzymać roboty przed zabiciem mojego serwera


9

Mam problemy z botami EXTREME na niektórych moich stronach internetowych na moim koncie hostingowym. Boty wykorzystują ponad 98% moich zasobów procesora i 99% mojej przepustowości dla całego konta hostingowego. Te boty generują ponad 1 GB ruchu na godzinę dla moich witryn. Rzeczywisty ruch ludzki dla wszystkich tych witryn jest mniejszy niż 100 MB / miesiąc .

Przeprowadziłem szeroko zakrojone badania zarówno pliku robots.txt, jak i .htaccess, aby zablokować te boty, ale wszystkie metody zawiodły.

Umieściłem również kod w plikach robots.txt, aby zablokować dostęp do katalogów skryptów, ale te boty (Google, MS Bing i Yahoo) ignorują reguły i mimo to uruchamiają skrypty.

Nie chcę całkowicie blokować botów Google, MS Bing i Yahoo, ale chcę ograniczyć tam szybkość indeksowania. Ponadto dodanie instrukcji opóźnienia indeksowania w pliku robots.txt nie spowalnia botów. Mój aktualny kod robots.txt i .htacces dla wszystkich witryn podano poniżej.

Skonfigurowałem zarówno narzędzia Microsoft, jak i Google dla webmasterów, aby spowolnić indeksowanie do absolutnego minimum, ale wciąż odwiedzają te witryny z szybkością 10 odsłon na sekundę.

Ponadto za każdym razem, gdy przesyłam plik, który powoduje błąd, cały serwer VPS ulega awarii w ciągu kilku sekund, tak że nie mogę nawet uzyskać dostępu do strony, aby rozwiązać problem z powodu ataku trafień tych botów.

Co mogę zrobić, aby zatrzymać ruch w moich witrynach?

W ciągu ostatnich miesięcy próbowałem wiele razy zapytać moją firmę hostingową (site5.com) o ten problem i nie mogą mi pomóc z tym problemem.

Naprawdę potrzebuję, aby Boty nie uruchomiły skryptu rss2html.php. Próbowałem obu sesji i plików cookie i oba zakończyły się niepowodzeniem.

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

AKTUALIZACJA, ABY POKAZAĆ DODANO AGENTA BOTA SPRAWDŹ KOD

<?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");
       }
     }
}
?>

Dodałem również następujące elementy do górnej części skryptu 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");}

Kiedy zaktualizowałeś swój robots.txt? Odczytanie zaktualizowanej wersji przez roboty może zająć trochę czasu.
ilanco

kilka dni temu. Naprawdę potrzebuję, aby Boty nie uruchomiły skryptu rss2html.php. Próbowałem obu sesji i plików cookie i oba zakończyły się niepowodzeniem.

Jak rss2html.phpkorzysta z Twojej witryny? przez PHP to między innymi przekierowania, Ajax ....?
cHao

Pliki rss2html.php są wywoływane za pomocą polecenia file_get_contents ()

file_get_contents... Wydaje się raczej dziwne. Plik jest na innym serwerze czy coś?
cHao

Odpowiedzi:


3

Jeśli rss2html.phpnie jest używany bezpośrednio przez klienta (to znaczy, że PHP zawsze go używa, a nie link lub coś takiego), zapomnij o próbach blokowania botów. Wszystko, co naprawdę musisz zrobić, to zdefiniować stałą lub coś na stronie głównej, a następnie includedrugi skrypt. W drugim skrypcie sprawdź, czy stała jest zdefiniowana, i wyrzuć błąd 403 lub pustą stronę lub cokolwiek, jeśli nie jest zdefiniowana.

Teraz, aby to zadziałało, musisz użyć includezamiast tego file_get_contents, ponieważ ten ostatni po prostu wczyta się do pliku (jeśli korzystasz ze ścieżki lokalnej) lub uruchomi się w innym procesie (jeśli „ ponownie używa adresu URL). Ale jest to metoda, która działa jak Joomla! służy do zapobiegania bezpośredniemu włączeniu skryptu. I użyj ścieżki pliku zamiast adresu URL, aby kod PHP nie był już analizowany przed próbą uruchomienia.

Jeszcze lepiej byłoby wyprowadzić rss2html.phpsię spod katalogu głównego dokumentu, ale niektóre hosty utrudniają to. To, czy jest to opcja, zależy od konfiguracji serwera / hosta.


1
Chao, dzięki. Obecnie przepisuję mój kod, aby zamiast tego przekonwertować zawartość file_get_contents.
Sammy,

4

Możesz ustawić skrypt, aby generował błąd 404 na podstawie ciągu agenta użytkownika dostarczonego przez boty - szybko dostaną podpowiedź i zostawią cię w spokoju.

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;
}

Przejrzyj swoje dzienniki i odrzuć Bingbota itp. W podobny sposób - nie powstrzyma to żądań, ale może zaoszczędzić trochę przepustowości - daj Googlebotowi smak własnego leku - Mwhahahahaha!

Zaktualizowano

Patrząc na twój kod, myślę, że twój problem jest tutaj:

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

Jeśli są złośliwymi botami, mogą pochodzić z dowolnego miejsca, usuń tę $ipaddressklauzulę i wyślij im odpowiedź 301 lub 404.

Myślenie z boku pudełka

  1. Googlebot nigdy nie akceptuje plików cookie , więc nie może ich przechowywać. W rzeczywistości, jeśli potrzebujesz plików cookie dla wszystkich użytkowników, prawdopodobnie uniemożliwi to botowi dostęp do Twojej strony.
  2. Googlebot nie rozumie formularzy - lub - javascript, więc możesz dynamicznie generować linki lub poprosić użytkowników o kliknięcie przycisku w celu uzyskania dostępu do kodu (z dołączonym odpowiednim tokenem).

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

    • rss2html.php? validated = 29e0-27fa12-fca4-cae3 - człowiek
    • rss2html.php - bot

1
Nie tak szybko, jak mogłoby się wydawać. Przez wiele miesięcy boty trafiały na tę samą nieistniejącą stronę, a czasem nawet lata po usunięciu strony. Zależy od tego, jak dobrze zachował się bot i do czego dąży.
cHao

Dla ludzi odwiedzających działa to tak, że plik index.php wywołuje skrypt rss2html.php. Boty unikają skryptu index.php i bezpośrednio uruchamiają skrypt rss2html.php. Jak mogę zabezpieczyć ten plik rss2html.php, jeśli nie uzyskano do niego dostępu za pomocą skryptu index.php?

Spróbuj zmienić nazwę pliku rss2html.php na coś innego i zaktualizuj plik index.php, aby odwoływał się do nowej nazwy.
BluesRockAddict

Próbowałem zmienić nazwę pliku, ale po kilku dniach nie udaje mu się to. Jak mogę dodać kod, którego używam do tego wątku? Chcę ci pokazać, co próbowałem.

1
ok - znam sztuczkę, którą można wyciągnąć :) - umieść kod skryptu rss2html.php poza swoją witryną (zaktualizuje odpowiedź)

2

PHP Limit / Blokuj żądania strony internetowej dla pająków / botów / klientów itp.

Tutaj napisałem funkcję PHP, która może blokować niechciane żądania w celu ograniczenia ruchu w witrynie. Dobry dla pająków, botów i irytujących klientów.

KLIENT / Blokowanie botów

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

KOD:

/* 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

Twoja witryna jest indeksowana przez fałszywych botów Google. Możesz spróbować dodać czek i podać 404 dla wszystkich fałszywych żądań botów Google.

Oto artykuł wyjaśniający, jak zweryfikować Googlebota: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Możesz także sprawdzić swoje dane w porównaniu ze znanymi fałszywymi botami: http://stopmalvertising.com/security/fake-google-bots.html


Dzięki, ale tak naprawdę próbowałem też, określając agentów użytkownika i wysyłając boty na stronę logowania. To również nie powiodło się.

Wygląda na to, że nie masz sensu - poleganie na kliencie użytkownika w celu ustalenia autentyczności bota nie jest wystarczające.
BluesRockAddict

1

Naprawdę powinieneś przede wszystkim upewnić się, że każda strona, której zażąda użytkownik, niezależnie od tego, jaki masz niewłaściwy robot, otrzyma stronę statyczną.

Apache mod_rewrite z warunkiem lub równoważny z serwerem http. W przypadku apache coś takiego:

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

dzięki, ale nie chcę całkowicie blokować botów Google, MS Bing i Yahoo, ale chcę ograniczyć tam bezpośrednie trafienia do pliku skryptu rss2html.php. Muszę tylko dodać coś na początku skryptu rss2html.php, który uniemożliwi uruchomienie go, jeśli nie będzie dostępny za pośrednictwem skryptu index.php. Boty obecnie uruchamiają skrypt rss2html.php, omijając plik index.php.
Sammy

Nie blokuje ich to. Po prostu podajesz wersję php w pamięci podręcznej. Jest to bardzo proste dla serwera do zrobienia, jest to jedna instancja mniej php / jeden proces potomny mniej apache. => Koszt (plik statyczny) <Koszt (instancja php).
smassey

jak mam buforować strony? Ponieważ strony są RSS, czy buforowane strony będą odświeżane wystarczająco często, aby dostarczyć świeże dane?
Sammy

Oczywiście ... Napisz cronjob, który zrobi to za Ciebie. Jeśli powiesz, że uderzyły one w serwer 10req / s, jeśli buforujesz strony przez 1 minutę, zapisałeś na swoim serwerze 599 dodatkowych instancji php (które z pewnością obejmują połączenia / zapytania db). I raz na minutę to znacznie więcej niż głosowałbym przez: 10/15 min.
smassey

1

Aby kontynuować pracę nad postem smassey, możesz nałożyć kilka warunków:

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

W ten sposób boty nadal uzyskują dostęp do twoich stron, ale nie tylko to. Ponieważ dziwne jest, że (legalne) boty nie przestrzegają reguł, czy masz osoby odsyłające, które wypychają boty na twoją stronę z innych źródeł (przekazywanie nazw domen, ...)


1

Rozwiązałem ten sam problem ze skryptem dostępnym na stronie http://perishablepress.com/blackhole-bad-bots/ . Dzięki takiemu podejściu do czarnej dziury zebrałem listę złośliwych adresów IP, a następnie odmówiłem im używania .htaccess. (Co nie jest obowiązkowe, ponieważ sam skrypt blokuje. Ale muszę zmniejszyć obciążenie serwera, unikając analizowania php pod kątem znanych niechcianych IPS) w ciągu trzech dni mój ruch spadł z 5 GB dziennie do 300 MB, co jest cichym oczekiwaniem.

Sprawdź również tę stronę, aby uzyskać pełną listę reguł htaccess, aby zablokować wiele znanych botów. 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");}

Ten skrypt nie robi tego, co mówi komentarz, w rzeczywistości robi coś zupełnie przeciwnego. To zawsze przepuszcza boty, ponieważ zmienna sesji nigdy nie zostanie ustawiona, gdy bot poprosi o skrypt. Potrafi jedynie zapobiegać wywoływaniu skryptu przez uzasadnione żądania (z index.php lub mobile.php).

Aby uniemożliwić botowi dostęp do skryptu, należy zezwolić na dostęp tylko wtedy, gdy zmienna sesji (lub plik cookie) jest rzeczywiście ustawiona. Zakładając oczywiście, że (złośliwy) bot nie akceptuje plików cookie. (Wiemy, że prawdziwy Googlebot nie.)

Jak już wspomniano, umieszczenie pliku rss2html.php nad katalogiem głównym (poza publiczną przestrzenią internetową) uniemożliwiłoby botowi bezpośredni dostęp do skryptu - ale mówisz, że powoduje to inne problemy? Lub umieść go w katalogu i chroń ten katalog za pomocą .htaccess. A może możesz nawet chronić sam plik w .htaccess przed bezpośrednimi żądaniami?


0

Skonfiguruj swoją domenę w Cloudflare (bezpłatna usługa w tym zakresie). Blokują złośliwe boty na poziomie domeny, zanim trafią na Twój serwer. Zajmuje około 20 minut, nigdy nie musisz małpować się z kodem.

Korzystam z tej usługi na wszystkich moich stronach i wszystkich stronach klienckich. Identyfikują złośliwe boty na podstawie wielu technik, w tym wykorzystując projekt Honey Pot.


0

Co musisz zrobić, to zainstalować certyfikat SSL na swoim serwerze dla apache / nginx / email / ftp. Włącz HSTS, a także musisz edytować plik ssl.conf, aby SSLv2 SSLv3 TLSv1 były wyłączone i nie pozwalały na połączenia przychodzące. Wzmocnij swój serwer we właściwy sposób, a nie będziesz mieć problemów z botami.


Nie jest dla mnie jasne, jaki problem rozwiązuje SSL / TLS w tym przypadku. Wygląda na to, że zadajesz pytanie i osiągasz wynik. Proszę wyjaśnić, w jaki sposób to rozwiązanie kontroluje problem.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.