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

9

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

J'ai fait des recherches approfondies sur les fichiers robots.txt et .htaccess pour bloquer ces bots 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 y limiter le taux d'exploration. De plus, l'ajout d'une instruction Crawl-delay dans le fichier robots.txt ne ralentit pas les bots. Mon code robots.txt et .htacces actuel pour tous les sites est indiqué ci-dessous.

J'ai configuré les outils de webmaster de Microsoft et de Google pour ralentir le taux d'exploration au minimum absolu, mais ils continuent de frapper ces sites à un taux de 10 visites / seconde.

De plus, chaque fois que je télécharge un fichier qui provoque une erreur, l'ensemble du serveur Web VPS tombe en quelques secondes, de sorte que je ne peux même pas accéder au site corriger le problème en raison de l'assaut de hits par ces bots.

Que puis-je faire pour arrêter le trafic sur mon site Web?

J'ai essayé de demander à mon hébergeur (site5.com) plusieurs fois à propos de ce problème 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 Bots d'exécuter le script rss2html.php. J'ai essayé les 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 CONTRÔLE DU BOT 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 en haut 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");}
Sammy
la source
Quand avez-vous mis à jour votre robots.txt? La lecture de la version mise à jour peut prendre du temps aux robots.
ilanco
Il y a quelques jours. Ce dont j'ai vraiment besoin, c'est d'empêcher les Bots d'exécuter le script rss2html.php. J'ai essayé les sessions et les cookies et les deux ont échoué.
Comment est rss2html.phputilisé par votre site? via PHP include, redirections, Ajax ....?
cHao
Le fichier rss2html.php est appelé via une commande file_get_contents ()
file_get_contents...? Semble plutôt étrange. Le fichier est sur un autre serveur ou quelque chose?
cHao

Réponses:

3

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

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

Encore mieux serait de rss2html.phpsortir de la racine du document, mais certains hôtes rendent cela difficile à faire. Cette option dépend de la configuration de votre serveur / hôte.

cHao
la source
1
Chao, merci. Actuellement, je réécris mon code pour convertir le fichier_get_contents à inclure à la place.
Sammy
4

Vous pouvez définir votre script pour générer une erreur 404 en fonction de la chaîne d'agent utilisateur fournie par les bots - ils obtiendront rapidement l'indice et vous laisseront tranquille.

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 la même manière - cela n'arrêtera pas les demandes, mais pourrait économiser de la bande passante - donnez à googlebot un avant-goût de sa propre médecine - Mwhahahahaha!

Mise à 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 malveillants, ils pourraient provenir de n'importe où, supprimez cette $ipaddressclause et lancez-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 robot 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é joint).

    <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
web_bod
la source
1
Pas aussi vite qu'on pourrait le penser. J'ai vu des bots frapper la même page inexistante pendant des mois, parfois même des années après la suppression de la page. Cela dépend de la façon dont le bot s'est bien comporté et de ce qu'il recherche.
cHao
La façon dont fonctionne pour les visiteurs humains est que le fichier index.php appelle le script rss2html.php. Les bots évitent le script index.php et exécutent directement le script rss2html.php. Comment puis-je protéger ce fichier rss2html.php s'il n'a pas été accessible via le script index.php?
Essayez de renommer rss2html.php en quelque chose d'autre et de mettre à jour votre index.php pour référencer un nouveau nom.
BluesRockAddict
J'ai essayé de renommer le fichier, mais il échoue après quelques jours. Comment puis-je ajouter le code que j'utilise à ce fil? Je veux vous montrer ce que j'ai essayé.
1
ok - je connais une astuce que vous pouvez tirer :) - mettez le code du script rss2html.php en dehors de votre site Web (mettra à jour la réponse)
2

PHP Limiter / Bloquer les demandes de sites Web pour Spiders / Bots / Clients, etc.

Ici, j'ai écrit une fonction PHP qui peut bloquer les demandes indésirables pour réduire le trafic de votre site Web. Bon pour les araignées, les robots et les clients ennuyeux.

CLIENT / Bots Blocker

DÉMO: 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 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!";
}
éblouissant
la source
1

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

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 enregistrements par rapport aux faux robots connus: http://stopmalvertising.com/security/fake-google-bots.html

BluesRockAddict
la source
Merci, mais en fait j'ai aussi essayé cela, en déterminant les agents utilisateurs et en envoyant les bots à une page de connexion. Cela a également échoué.
On dirait que vous manquez le point - compter sur l'agent utilisateur pour déterminer l'authenticité du bot n'est pas suffisant.
BluesRockAddict
1

Vous devez vraiment vous assurer en premier lieu que toute page demandée à un agent utilisateur, quel que soit le robot abusif dont vous disposez, recevra une page statique.

Un mod_rewrite apache 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]
smassey
la source
merci, mais je ne veux pas bloquer complètement les bots Google, MS Bing et Yahoo, mais je veux y limiter les hits directs sur le fichier de script rss2html.php. J'ai juste besoin d'ajouter quelque chose au début du script rss2html.php qui l'empêchera de fonctionner s'il n'a pas été accessible via le script index.php. Les robots exécutent actuellement le script rss2html.php en contournant le fichier index.php.
Sammy
Cela ne les bloque pas .. vous servez simplement une version en cache de votre php .. c'est très facile pour un serveur de faire, c'est une instance php en moins / un processus enfant apache en moins. => Coût (fichier statique) <Coût (instance php).
smassey
comment mettre en cache les pages? Étant donné que les pages sont RSS, les pages mises en cache seront-elles actualisées suffisamment souvent pour fournir de nouvelles données?
Sammy
Bien sûr ... Écrivez un cronjob qui le fait pour vous. Si vous dites qu'ils atteignent le serveur 10req / s si vous cachez les pages pendant 1 minute, vous avez enregistré 599 instances php supplémentaires sur votre serveur (qui incluent certainement des connexions / requêtes db) .. Et une fois par minute, c'est beaucoup plus que ce que je voterais pour: 10 / 15min.
smassey
1

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 bots accèdent toujours à vos pages, mais pas à celle-là. Comme il est étrange que les bots (légitimes) ne respectent pas les règles, avez-vous des référents qui poussent les bots vers votre page à partir d'autres sources (transfert de nom de domaine, ...)

ndrix
la source
1

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

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

Nishad TR
la source
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");}

Ce script ne fait pas ce que dit le commentaire, en fait il fait tout le contraire. Cela laissera toujours passer les bots, car la variable de session ne sera jamais définie lorsque le bot demandera votre script. Tout ce qu'il peut faire, c'est empêcher les requêtes légitimes (depuis index.php ou mobile.php) d'appeler le script plus d'une 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 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 cause d'autres problèmes? Ou, placez-le dans un répertoire et protégez ce répertoire avec .htaccess. Ou vous pourriez même être en mesure de protéger uniquement le fichier lui-même dans .htaccess contre les demandes directes?

MrWhite
la source
0

Allez configurer votre domaine sur Cloudflare (service gratuit pour cela). Ils bloquent les robots malveillants au niveau du domaine avant de frapper 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 sur la base d'un certain nombre de techniques, notamment l'exploitation du projet Honey pot.

Brett Bumeter
la source
0

Ce que vous devez faire est d'installer un certificat SSL sur votre serveur pour apache / nginx / email / ftp. Activez HSTS et vous devez également modifier votre fichier ssl.conf pour que SSLv2 SSLv3 TLSv1 soit désactivé et n'autorise pas les connexions entrantes. Renforcez votre serveur de la bonne manière et vous n'aurez aucun problème avec les bots.

Robert
la source
Le problème que SSL / TLS résout dans ce cas n'est pas clair pour moi. Il semble que vous posiez la question et arriviez au résultat. Veuillez expliquer comment cette solution contrôle le problème.