web-dev-qa-db-fra.com

Besoin d'empêcher les robots de tuer mon serveur Web

J'ai des problèmes de bot extrêmes sur certains de mes sites Web dans mon compte d'hébergement. Les bots utilisent plus de 98% de mes ressources en processeur et 99% de ma bande passante pour l'ensemble de mon compte d'hébergement. Ces robots génèrent plus de 1 Go de trafic par heure pour mes sites. Le trafic humain réel pour tous ces sites est moins de 100 Mo/mois.

J'ai effectué des recherches approfondies sur les fichiers robots.txt et .htaccess pour bloquer ces robots, mais toutes les méthodes ont échoué.

J'ai également mis du code dans les fichiers robots.txt pour bloquer l'accès aux répertoires de scripts, mais ces robots (Google, MS Bing et Yahoo) ignorent les règles et exécutent les scripts de toute façon.

Je ne veux pas bloquer complètement les robots Google, MS Bing et Yahoo, mais je veux limiter leur taux d'analyse. En outre, l'ajout d'une instruction Crawl-delay dans le fichier robots.txt ne ralentit pas les robots. Mon code actuel robots.txt et .htacces pour tous les sites est indiqué ci-dessous.

J'ai configuré les outils pour les webmasters de Google et de Google afin de ralentir le taux d'analyse au minimum absolu, mais ils continuent de visionner ces sites à un taux de 10 hits/seconde.

En outre, chaque fois que je télécharge un fichier qui cause une erreur, le serveur Web VPS entier tombe en panne en quelques secondes, de sorte que je ne peux même pas accéder au site, mais le problème est résolu en raison de l’attaque de hits par ces robots.

Que puis-je faire pour arrêter le trafic sur mes sites Web?

J'ai essayé de demander à ma société d'hébergement Web (site5.com) plusieurs fois à ce sujet au cours des derniers mois et ils ne peuvent pas m'aider à résoudre ce problème.

Ce dont j'ai vraiment besoin, c'est d'empêcher les robots d'exécuter le script rss2html.php. J'ai essayé les deux sessions et les cookies et les deux ont échoué.

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

MISE À JOUR POUR MONTRER LE CODE DE BOT CHECK DE L'AGENT UTILISATEUR AJOUTÉ

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

J'ai également ajouté ce qui suit au début du 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");}
10
Sammy

Si rss2html.php n'est pas utilisé directement par le client (c'est-à-dire si PHP l'utilise toujours plutôt que comme un lien ou quelque chose), alors oubliez d'essayer de bloquer les robots. Tout ce que vous avez à faire est de définir une constante ou quelque chose dans la page principale, puis include l'autre script. Dans l'autre script, vérifiez si la constante est définie et crachez une erreur 403, une page vierge ou autre, si elle n'est pas définie.

Maintenant, pour que cela fonctionne, vous devrez utiliser include plutôt que file_get_contents, car ce dernier lira simplement dans le fichier (si vous utilisez un chemin local), ou exécuté dans un tout autre processus (si vous utilisez une URL). Mais c’est la méthode qui utilise Joomla! utilise pour empêcher l'inclusion directe d'un script. Et utilisez un chemin de fichier plutôt qu'une URL, de sorte que le code PHP ne soit pas déjà analysé avant d'essayer de l'exécuter.

Mieux encore serait de déplacer rss2html.php de sous la racine du document, mais certains hôtes rendent cela difficile. Le choix de cette option dépend de la configuration de votre serveur/hôte.

3
cHao

Vous pouvez configurer votre script pour générer une erreur 404 en fonction de la chaîne d'agent utilisateur fournie par les robots: ils obtiendront rapidement l'indication et vous laisseront seuls.

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

Parcourez vos journaux et rejetez Bingbot, etc. de manière similaire - cela n'arrêtera pas les demandes, mais vous économisera peut-être de la bande passante - donnez à googlebot un avant-goût de son propre médicament - Mwhahahahaha!

Mis à jour

En regardant votre code, je pense que votre problème est ici:

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

S'ils sont des robots malicieux, ils pourraient venir de n'importe où, supprimez la clause $ipaddress et envoyez-leur une réponse 301 ou 404.

Penser juste à côté de la boîte

  1. Googlebot n'accepte jamais les cookies , il ne peut donc pas les stocker. En fait, si vous avez besoin de cookies pour tous les utilisateurs, cela empêchera probablement le bot d’accéder à votre page.
  2. Googlebot ne comprend pas les formulaires - ou - javascript, vous pouvez donc générer dynamiquement vos liens ou demander aux utilisateurs de cliquer sur un bouton pour accéder à votre code (avec un jeton approprié attaché).

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

    • rss2html.php? validated = 29e0-27fa12-fca4-cae3 - humain
    • rss2html.php - bot
4
web_bod

Limiter/bloquer les requêtes de sites Web pour Spiders/Bots/Clients, etc.

Ici, j’ai écrit une fonction PHP qui peut bloquer les requêtes non désirées afin de réduire le trafic de votre site Web. Dieu pour les araignées, les bots et les clients agaçants.

CLIENT/Bloqueur de Bots

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

CODE:

/* Function which can Block unwanted Requests
 * @return boolean/array status
 */
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.

        */

        $dir = 'requestBlocker/'; ## Create & set directory writeable!!!!

        $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 does 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) {
                        $left = $time - $timestampPast;
                        if (($left) > $rules[$ruleNr]['blockTime']) {
                                unset($client['block'][$ruleNr]);
                                continue;
                        }
                        $blockIt[] = 'Block active for Rule: ' . $ruleNr . ' - unlock in ' . ($left - $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] = '';
                $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!";
}
2
dazzafact

J'ai résolu le même problème avec le script disponible à l'adresse http://perishablepress.com/blackhole-bad-bots/ . Avec cette approche de trou noir, j'ai recueilli une liste d'adresses IP malveillantes, puis en utilisant .htaccess. (Ce qui n'est pas obligatoire, car le script lui-même interdit. Mais je dois réduire la charge du serveur en évitant d'analyser php pour les ips indésirables connus) en trois jours, mon trafic est tombé de 5 Go par jour à 300 Mo, ce qui est peu probable.

Vérifiez également sur cette page la liste complète des règles htaccess permettant de bloquer de nombreux robots indésirables. http://www.askapache.com/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html

1
Nishad TR

Il est probable que votre site soit indexé par de faux robots Google. Vous pouvez essayer d’ajouter un chèque et servir 404 pour toutes les fausses demandes de google bot.

Voici un article qui explique comment vérifier Googlebot: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Vous pouvez également vérifier vos données par rapport à de faux robots connus: http://stopmalvertising.com/security/fake-google-bots.html

1
BluesRockAddict

En premier lieu, vous devez vous assurer que toute page demandée à un utilisateur, quel que soit le robot d'exploration abusif que vous avez, recevra une page statique.

Un Apache mod_rewrite avec une condition ou équivalent avec votre serveur http. Pour Apache, quelque chose comme ceci:

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

Pour continuer sur le post de smassey, vous pouvez poser plusieurs conditions:

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

De cette façon, les robots continuent d’accéder à vos pages, mais pas à celle-là. Comme il est étrange que les robots (légitimes) ne respectent pas les règles, avez-vous des référents qui envoient des robots à votre page à partir d'autres sources (transfert de nom de domaine, ...)

1
ndrix

Ce que vous devez faire, c'est installer un certificat SSL sur votre serveur pour Apache/nginx/email/ftp. Activez HSTS et vous devez également modifier votre fichier ssl.conf afin que SSLv2 SSLv3 TLSv1 soit désactivé et n'autorise pas les connexions entrantes. Renforcez votre serveur de la bonne manière et vous ne rencontrerez aucun problème de la part des robots.

0
Robert

Allez configurer votre domaine sur Cloudflare (service gratuit pour cela). Ils bloquent les robots malveillants au niveau du domaine avant qu'ils n'atteignent votre serveur. Prend environ 20 minutes, ne jamais avoir à singe avec le code.

J'utilise ce service sur tous mes sites et tous les sites clients. Ils identifient les robots malveillants en utilisant un certain nombre de techniques, notamment le projet Honey Pot.

0
Brett Bumeter
// 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");}

Ce script ne fait pas ce que dit le commentaire, il fait tout le contraire. Ceci toujours laissera passer les robots, car la variable de session ne sera jamais définie lorsque le bot demande votre script. Tout ce que cela peut faire est d'empêcher les requêtes légitimes (de index.php ou mobile.php) d'appeler le script plusieurs fois.

Afin d'empêcher un bot d'accéder à votre script, vous ne devez autoriser l'accès que si une variable de session (ou un cookie) est réellement définie. En supposant bien sûr que le bot (malveillant) n'accepte pas les cookies. (Nous savons que le vrai Googlebot ne le fait pas.)

Comme cela a déjà été mentionné, placer rss2html.php au-dessus de la racine Web (en dehors de l'espace Web public) empêcherait un bot d'accéder directement au script - mais vous dites que cela pose d'autres problèmes? Ou placez-le dans un répertoire et protégez-le avec .htaccess. Ou vous pourriez même être capable de protéger uniquement le fichier dans .htaccess des requêtes directes?

0
MrWhite