Devo impedire ai robot di uccidere il mio server web


9

Sto riscontrando problemi di bot EXTREME su alcuni dei miei siti Web nel mio account di hosting. I bot utilizzano oltre il 98% delle risorse della mia CPU e il 99% della mia larghezza di banda per l'intero account di hosting. Questi bot generano oltre 1 GB di traffico all'ora per i miei siti. Il traffico umano reale per tutti questi siti è inferiore a 100 MB / mese .

Ho fatto ricerche approfondite su entrambi i file robots.txt e .htaccess per bloccare questi bot, ma tutti i metodi hanno fallito.

Ho anche inserito codice nei file robots.txt per bloccare l'accesso alle directory degli script, ma questi bot (Google, MS Bing e Yahoo) ignorano le regole ed eseguono comunque gli script.

Non voglio bloccare completamente i bot di Google, MS Bing e Yahoo, ma voglio limitare la velocità di scansione. Inoltre, l'aggiunta di un'istruzione Crawl-delay nel file robots.txt non rallenta i bot. Il mio attuale codice robots.txt e .htacces per tutti i siti sono indicati di seguito.

Ho impostato gli strumenti per i webmaster di Microsoft e Google per rallentare la velocità di scansione al minimo assoluto, ma continuano a colpire questi siti con una frequenza di 10 hit / secondo.

Inoltre, ogni volta che carico un file che causa un errore, l'intero server web VPS si interrompe in pochi secondi in modo tale che non riesco nemmeno ad accedere al sito per correggere il problema a causa dell'assalto di hit da parte di questi robot.

Cosa posso fare per fermare il traffico in-slot verso i miei siti Web?

Ho provato a chiedere alla mia società di web hosting (site5.com) più volte su questo problema negli ultimi mesi e non possono aiutarmi con questo problema.

Ciò di cui ho davvero bisogno è impedire ai bot di eseguire lo script rss2html.php. Ho provato sia le sessioni che i cookie ed entrambi sono falliti.

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

AGGIORNARE PER VISUALIZZARE IL CODICE DI CONTROLLO BOT AGENTE UTENTE AGGIUNTO

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

Ho anche aggiunto quanto segue all'inizio dello script 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");}

Quando hai aggiornato il tuo robots.txt? La lettura della versione aggiornata può richiedere del tempo ai robot.
ilanco,

pochi giorni fa. Ciò di cui ho davvero bisogno è impedire ai bot di eseguire lo script rss2html.php. Ho provato sia le sessioni che i cookie ed entrambi sono falliti.

Come viene rss2html.phputilizzato dal tuo sito? tramite PHP include, reindirizzamenti, Ajax ....?
cHao,

I file rss2html.php vengono chiamati tramite un comando file_get_contents ()

file_get_contents...? Sembra piuttosto strano. Il file si trova su un altro server o qualcosa del genere?
cHao,

Risposte:


3

Se rss2html.phpnon viene utilizzato direttamente dal client (ovvero, se è PHP che lo utilizza sempre anziché essere un collegamento o qualcosa del genere), dimentica di provare a bloccare i robot. Tutto quello che devi fare è definire una costante o qualcosa nella pagina principale, quindi includel'altro script. Nell'altro script, controlla se la costante è definita e sputa un errore 403 o una pagina vuota o qualsiasi altra cosa se non è definita.

Ora, affinché questo funzioni, dovrai usare includepiuttosto che file_get_contents, poiché quest'ultimo leggerà semplicemente nel file (se stai usando un percorso locale), o eseguirà un altro processo (se riutilizzando un URL). Ma è il metodo che roba come Joomla! utilizza per impedire che uno script venga incluso direttamente. E usa un percorso di file anziché un URL, in modo che il codice PHP non sia già analizzato prima di provare a eseguirlo.

Ancora meglio sarebbe rss2html.phpuscire da sotto la radice del documento, ma alcuni host lo rendono difficile da fare. Se questa è un'opzione dipende dalla configurazione del tuo server / host.


1
Chao, grazie. Attualmente, sto riscrivendo il mio codice per convertire invece i file_get_contents da includere.
Sammy,

4

Puoi impostare il tuo script in modo da generare un errore 404 basato sulla stringa dell'agente utente fornita dai robot: riceveranno rapidamente il suggerimento e ti lasceranno in pace.

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

Scorri i tuoi registri e rifiuta Bingbot, ecc. In un modo simile - non fermerà le richieste, ma potrebbe risparmiare un po 'di larghezza di banda - dai a googlebot un assaggio della sua stessa medicina - Mwhahahahaha!

aggiornato

Guardando il tuo codice, penso che il tuo problema sia qui:

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

Se sono bot dannosi, potrebbero provenire da qualsiasi luogo, eliminare la $ipaddressclausola e lanciare una risposta 301 o 404.

Pensando a destra al lato della scatola

  1. Googlebot non accetta mai i cookie , quindi non può memorizzarli. In effetti, se hai bisogno di cookie per tutti gli utenti, probabilmente questo impedirà al bot di accedere alla tua pagina.
  2. Googlebot non capisce i moduli - o - javascript, quindi potresti generare dinamicamente i tuoi collegamenti o fare in modo che gli utenti facciano clic su un pulsante per raggiungere il tuo codice (con un token adatto allegato).

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

    • rss2html.php? validated = 29e0-27fa12-fca4-cae3 - umano
    • rss2html.php - bot

1
Non così rapidamente come potresti pensare. Ho visto bot colpire la stessa pagina inesistente per mesi, a volte anche anni dopo l'eliminazione della pagina. Dipende da quanto si comporta bene il bot e da cosa sta cercando.
cHao,

Il modo in cui funziona per i visitatori umani è che il file index.php chiama lo script rss2html.php. I bot evitano lo script index.php ed eseguono direttamente lo script rss2html.php. Come posso proteggere quel file rss2html.php se non è stato effettuato l'accesso tramite lo script index.php?

Prova a rinominare rss2html.php in qualcos'altro e ad aggiornare il tuo index.php per fare riferimento al nuovo nome.
BluesRockAddict,

Ho provato a rinominare il file, ma dopo alcuni giorni fallisce. Come posso aggiungere il codice che sto usando a questa discussione? Voglio mostrarti cosa ho provato.

1
ok - so un trucco che puoi tirare :) - metti il ​​codice dello script rss2html.php fuori dal tuo sito web (aggiornerà la risposta)

2

Limitare / bloccare le richieste del sito Web di PHP per ragni / robot / clienti ecc.

Qui ho scritto una funzione PHP che può bloccare richieste indesiderate per ridurre il traffico del tuo sito web. Buono per ragni, robot e clienti fastidiosi.

CLIENT / Bots Blocker

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

CODICE:

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

È probabile che il tuo sito sia indicizzato da bot google fasulli. Puoi provare ad aggiungere un assegno e pubblicare 404 per tutte le richieste di bot google false.

Ecco un articolo che spiega come verificare Googlebot: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Inoltre puoi controllare i tuoi record con noti falsi bot: http://stopmalvertising.com/security/fake-google-bots.html


Grazie, ma in realtà ci ho provato anche io, determinando i programmi utente e inviando i robot a una pagina di accesso. Anche questo ha fallito.

Sembra che ti stia perdendo il punto: basarsi sull'agente utente per determinare l'autenticità del bot non è sufficiente.
BluesRockAddict,

1

Dovresti davvero assicurarti in primo luogo che qualsiasi pagina richiesta da un utente, di qualsiasi crawler abusivo che hai, verrà servita una pagina statica.

Un ap_mod_modrite con una condizione o equivalente con il tuo server http. Per apache, qualcosa del genere:

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

grazie, ma non voglio bloccare completamente i bot di Google, MS Bing e Yahoo, ma voglio limitare gli hit diretti sul file di script rss2html.php. Ho solo bisogno di aggiungere qualcosa all'inizio dello script rss2html.php che ne impedirà l'esecuzione se non fosse accessibile tramite lo script index.php. I bot attualmente eseguono lo script rss2html.php bypassando il file index.php.
Sammy,

Questo non li blocca .. servi semplicemente una versione cache del tuo php .. questo è molto facile per un server da fare, è un'istanza php in meno / un processo figlio apache in meno. => Costo (file statico) <Costo (istanza php).
smassey,

come avrei memorizzato nella cache le pagine? Poiché le pagine sono RSS, le pagine memorizzate nella cache verranno aggiornate abbastanza spesso da fornire nuovi dati?
Sammy,

Certo ... Scrivi un cronjob che lo fa per te. Se dici che colpiscono il server 10req / s se memorizzi nella cache le pagine per 1 minuto hai salvato sul tuo server 599 istanze php extra (che certamente includono connessioni / query db) .. E una volta al minuto è molto più di quello che voterei per: 10 / 15min.
smassey,

1

Per continuare sul post di smassey, puoi porre diverse condizioni:

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

In questo modo, i robot accedono ancora alle tue pagine, ma non quello. Poiché è strano che i robot (legittimi) non rispettino le regole, hai dei referenti che spingono i robot sulla tua pagina da altre fonti (inoltro del nome di dominio, ...)


1

Ho risolto lo stesso problema con lo script disponibile su http://perishablepress.com/blackhole-bad-bots/ . Con questo approccio blackhole ho raccolto un elenco di IP dannosi e quindi l'utilizzo di .htaccess li ha negati. (Il che non è obbligatorio, poiché lo script stesso fa il bando. Ma devo ridurre il carico del server evitando l'analisi del php per ips indesiderati noti) in tre giorni il mio traffico è sceso da 5 GB al giorno a 300 MB, il che è abbastanza previsto.

Controlla questa pagina anche per l'elenco completo delle regole htaccess per bloccare molti robot spazzatura noti. 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");}

Questo script non fa ciò che dice il commento, anzi fa l'esatto contrario. Ciò consentirà sempre il passaggio dei robot, poiché la variabile di sessione non verrà mai impostata quando il bot richiede lo script. Tutto ciò che potenzialmente farà è impedire alle richieste legittime (da index.php o mobile.php) di chiamare lo script più di una volta.

Per impedire a un bot di accedere al tuo script, dovresti consentire l'accesso solo se una variabile di sessione (o cookie) è effettivamente impostata. Supponendo ovviamente che il bot (dannoso) non accetti i cookie. (Sappiamo che il vero Googlebot no.)

Come già accennato, posizionare rss2html.php sopra la radice del web (al di fuori dello spazio web pubblico) impedirebbe a un bot di accedere direttamente allo script - ma dici che questo causa altri problemi? Oppure, inseriscilo in una directory e proteggi quella directory con .htaccess. O potresti persino essere in grado di proteggere solo il file stesso in .htaccess da richieste dirette?


0

Vai a configurare il tuo dominio su Cloudflare (servizio gratuito per questo). Bloccano i bot dannosi a livello di dominio prima che colpiscano il tuo server. Richiede circa 20 minuti, non è mai necessario cercare il codice.

Uso questo servizio su tutti i miei siti e su tutti i siti client. Identificano robot dannosi in base a una serie di tecniche, tra cui il progetto Honey pot.


0

Quello che devi fare è installare un certificato SSL sul tuo server per apache / nginx / email / ftp. Abilitare HSTS e inoltre è necessario modificare il file ssl.conf in modo che SSLv2 SSLv3 TLSv1 siano disabilitati e non consentano connessioni in entrata. Rafforza il tuo server nel modo giusto e non avrai problemi con i robot.


Non mi è chiaro quale problema SSL / TLS stia risolvendo in questo caso. Sembra che tu stia implorando la domanda e arrivando al risultato. Spiegare come questa soluzione controlla il problema.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.