it-swarm.com.de

Ich muss verhindern, dass Bots meinen Webserver töten

Ich habe auf einigen meiner Websites in meinem Hosting-Konto EXTREME Bot-Probleme. Die Bots nutzen über 98% meiner CPU-Ressourcen und 99% meiner Bandbreite für mein gesamtes Hosting-Konto. Diese Bots generieren über 1 GB Traffic pro Stunde für meine Websites. Der tatsächliche Datenverkehr für alle diese Websites beträgt weniger als 100 MB/Monat.

Ich habe mich intensiv mit der robots.txt- und der .htaccess-Datei befasst, um diese Bots zu blockieren, aber alle Methoden sind fehlgeschlagen.

Ich habe auch Code in die robots.txt-Dateien eingefügt, um den Zugriff auf die Skriptverzeichnisse zu blockieren, aber diese Bots (Google, MS Bing und Yahoo) ignorieren die Regeln und führen die Skripte trotzdem aus.

Ich möchte die Google-, MS Bing- und Yahoo-Bots nicht vollständig blockieren, aber die Crawling-Rate beschränken. Durch das Hinzufügen einer Crawl-delay-Anweisung in der robots.txt-Datei werden die Bots nicht verlangsamt. Mein aktueller robots.txt- und .htacces-Code für alle Websites ist unten angegeben.

Ich habe sowohl Microsoft- als auch Google-Webmaster-Tools eingerichtet, um die Durchforstungsrate auf das absolute Minimum zu reduzieren. Sie erreichen diese Websites jedoch immer noch mit einer Geschwindigkeit von 10 Treffern/Sekunde.

Jedes Mal, wenn ich eine Datei hochlade, die einen Fehler verursacht, fällt der gesamte VPS-Webserver innerhalb von Sekunden aus, sodass ich nicht einmal auf die Site zugreifen kann, um das Problem zu beheben.

Was kann ich tun, um den Datenverkehr auf meinen Websites zu stoppen?

Ich habe in den letzten Monaten viele Male versucht, mein Webhosting-Unternehmen (site5.com) nach diesem Problem zu fragen, und sie können mir bei diesem Problem nicht helfen.

Was ich wirklich brauche, ist zu verhindern, dass die Bots das Skript rss2html.php ausführen. Ich habe beide Sitzungen und Cookies ausprobiert und beide sind fehlgeschlagen.

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

.zugang

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

PDATE FÜR HINZUGEFÜGTEN BENUTZERAGENTEN-BOT-CHECK-CODE

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

Ich habe auch das Folgende zum Anfang des Skripts rss2html.php hinzugefügt

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

Wenn rss2html.php nicht direkt vom Client verwendet wird (d. H., Wenn es PHP ist, wird es immer verwendet, anstatt ein Link oder etwas anderes), vergessen Sie, Bots zu blockieren. Alles, was Sie wirklich tun müssen, ist, eine Konstante oder etwas auf der Hauptseite zu definieren, dann include das andere Skript. Überprüfen Sie im anderen Skript, ob die Konstante definiert ist, und geben Sie einen 403-Fehler oder eine leere Seite oder was auch immer aus, wenn sie nicht definiert ist.

Damit dies funktioniert, müssen Sie include anstelle von file_get_contents verwenden, da letztere entweder nur die Datei einlesen (wenn Sie einen lokalen Pfad verwenden) oder in einem anderen Prozess ausführen (wenn Sie eine URL verwenden). Aber es ist die Methode, die Sachen wie Joomla! verhindert, dass ein Skript direkt eingebunden wird. Verwenden Sie statt einer URL einen Dateipfad, damit der PHP -Code nicht bereits analysiert wird, bevor Sie versuchen, ihn auszuführen.

Noch besser wäre es, rss2html.php aus dem Dokumentenstamm zu entfernen, aber einige Hosts machen dies schwierig. Ob dies eine Option ist, hängt vom Setup Ihres Servers/Hosts ab.

3
cHao

Sie können Ihr Skript so einstellen, dass basierend auf der von den Bots bereitgestellten Benutzeragentenzeichenfolge ein 404-Fehler ausgegeben wird - sie erhalten den Hinweis schnell und lassen Sie in Ruhe.

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

Durchsuchen Sie Ihre Protokolle und lehnen Sie Bingbot usw. auf ähnliche Weise ab - es stoppt die Anfragen nicht, spart jedoch möglicherweise Bandbreite - geben Sie Googlebot einen Vorgeschmack auf seine eigene Medizin - Mwhahahahaha!

Aktualisiert

Wenn Sie sich Ihren Code ansehen, ist Ihr Problem wahrscheinlich hier:

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

Wenn es sich um böswillige Bots handelt, können Sie diese $ipaddress -Klausel entfernen und eine 301- oder 404-Antwort auf sie werfen.

Ganz neben der Kiste nachdenken

  1. Googlebot akzeptiert keine Cookies , kann sie also nicht speichern. In der Tat, wenn Sie Cookies für alle Benutzer benötigen, wird dies wahrscheinlich den Bot davon abhalten, auf Ihre Seite zuzugreifen.
  2. Der Googlebot versteht weder Formulare noch Javascript, sodass Sie Ihre Links dynamisch generieren oder die Nutzer auf eine Schaltfläche klicken können, um zu Ihrem Code zu gelangen (mit einem geeigneten Token im Anhang).

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

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

PHP Limit/Block Website Anfragen für Spiders/Bots/Clients etc.

Hier habe ich eine PHP Funktion geschrieben, die unerwünschte Requests blockieren kann, um Ihren Website-Traffic zu reduzieren. Gott für Spinnen, Bots und nervige Kunden.

CLIENT/Bots Blocker

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

Ich habe das gleiche Problem mit dem Skript unter http://perishablepress.com/blackhole-bad-bots/ behoben. Mit diesem Blackhole-Ansatz habe ich eine Liste mit böswilligen IP-Adressen gesammelt und sie dann mithilfe von .htaccess abgelehnt. (Das ist nicht obligatorisch, da das Skript selbst das Sperren vornimmt. Aber ich muss die Serverlast reduzieren, indem ich das Parsing von PHP für bekannte unerwünschte IPS vermeide.) In drei Tagen ging mein Datenverkehr von 5 GB pro Tag auf 300 MB zurück, was ruhig erwartet wird.

Auf dieser Seite finden Sie auch eine vollständige Liste der Zugriffsregeln, um viele bekannte Junk-Bots zu blockieren. http://www.askapache.com/htaccess/blocking-bad-bots-and-scrapers-with-htaccess.html

1
Nishad TR

Es ist wahrscheinlich, dass Ihre Website von gefälschten Google-Bot (s) indiziert wird. Sie können versuchen, einen Scheck hinzuzufügen und 404 für alle gefälschten Google Bot-Anfragen zu liefern.

In diesem Artikel wird das Überprüfen von Googlebot erläutert: http://googlewebmastercentral.blogspot.com/2006/09/how-to-verify-googlebot.html

Sie können Ihre Aufzeichnungen auch auf bekannte gefälschte Bots überprüfen: http://stopmalvertising.com/security/fake-google-bots.html

1
BluesRockAddict

Sie sollten in erster Linie sicherstellen, dass jede von einem Benutzeragenten angeforderte Seite, unabhängig davon, welchen missbräuchlichen Crawler Sie verwenden, eine statische Seite erhält.

Ein Apache-Mod_rewrite mit einer Bedingung oder einer Entsprechung mit Ihrem http-Server. Für Apache ungefähr so:

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

Um auf dem Posten von smassey fortzufahren, können Sie mehrere Bedingungen stellen:

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

Auf diese Weise greifen die Bots immer noch auf Ihre Seiten zu, aber nur nicht auf diese. Da es seltsam ist, dass die (legitimen) Bots sich nicht an Regeln halten, haben Sie Verweise, die Bots aus anderen Quellen auf Ihre Seite pushen (Domainnamenweiterleitung, ...)?

1
ndrix

Sie müssen lediglich ein SSL-Zertifikat für Apache/nginx/email/ftp auf Ihrem Server installieren. Aktivieren Sie HSTS und müssen Sie Ihre ssl.conf-Datei so bearbeiten, dass SSLv2 SSLv3 TLSv1 deaktiviert ist und eingehende Verbindungen nicht zulässt. Stärken Sie Ihren Server auf die richtige Weise und Sie werden keine Probleme mit Bots haben.

0
Robert

Richten Sie Ihre Domain auf Cloudflare ein (kostenloser Service hierfür). Sie blockieren böswillige Bots auf Domain-Ebene, bevor sie Ihren Server erreichen. Dauert ca. 20 Minuten, muss nie mit dem Code affen.

Ich benutze diesen Service auf allen meinen Sites und allen Client-Sites. Sie identifizieren böswillige Bots, basierend auf einer Reihe von Techniken, einschließlich der Nutzung des Projektes 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");}

Dieses Skript macht nicht das, was der Kommentar sagt, sondern das Gegenteil. Dies wird immer die Bots durchlassen, da die Sitzungsvariable niemals gesetzt wird, wenn der Bot Ihr Skript anfordert. Alles, was es möglicherweise tun kann, ist zu verhindern, dass legitime Anfragen (von index.php oder mobile.php) das Skript mehrmals aufrufen.

Um zu verhindern, dass ein Bot auf Ihr Skript zugreift, sollten Sie den Zugriff nur zulassen, wenn tatsächlich eine Sitzungsvariable (oder ein Cookie) festgelegt ist. Vorausgesetzt natürlich, dass der (böswillige) Bot keine Cookies akzeptiert. (Wir wissen, dass der echte Googlebot dies nicht tut.)

Wie bereits erwähnt, würde das Platzieren von rss2html.php über dem Webstamm (außerhalb des öffentlichen Webspace) verhindern, dass ein Bot direkt auf das Skript zugreift - aber Sie sagen, dass dies andere Probleme verursacht? Oder legen Sie es in ein Verzeichnis und schützen Sie dieses Verzeichnis mit .htaccess. Oder können Sie sogar nur die Datei selbst in .htaccess vor direkten Anforderungen schützen?

0
MrWhite