webentwicklung-frage-antwort-db.com.de

Anzahl der Seitenanfragen eines Bots in 5 Sekunden

Ich schreibe ein Skript, das jeden Bot blockiert, der Seiten anfordert, zum Beispiel X mal in der Vergangenheit 5 Sekunden. Ich muss das X hier finden. Kennt ihr ein paar ungefähre Werte, die ich verwenden kann?

6
Manish Pradhan

vielleicht ist es besser für Sie, Ihre Firewall zu verwenden, als sich auf ein PHP-Skript zu verlassen, da das PHP-Skript nur das Laden von PHP-Seiten beeinflusst und keine statischen Dateien wie Bilder. Wenn Sie alle Verbindungen per PHP protokollieren und für jede Anfrage über dieselbe IP-Adresse nach> 800 suchen, erhöht sich der Overhead für Ihren Server, möglicherweise sogar noch mehr als für die Anfragen selbst!

Wenn Sie einen Linux-Server haben, können Sie IPTables verwenden:

http://blog.bodhizazen.net/linux/prevent-dos-with-iptables/

wenn Sie fail2ban so einrichten, dass übermäßige GETs blockiert werden, sollten Sie sicher sein, dass keine echten Benutzer mit einem Limit von 800/2 Sekunden blockiert werden

http://go2linux.garron.me/linux/2011/05/fail2ban-protect-web-server-http-dos-attack-1084.html

Unter Windows Server ... naja, ich glaube nicht, dass Sie Verbindungen/Sek. Begrenzen können, aber ich denke, Sie können Bandbreitenkontingente in den QoS-Diensten festlegen, die die Bots effektiv begrenzen würden. Oder es gibt viele Tools von Drittanbietern, mit denen Sie dies erreichen können.

Bearbeiten

Ich habe darüber etwas mehr nachgedacht, und es scheint die effizienteste Möglichkeit zu sein, jede IP-Anfrage zu protokollieren und frühere Treffer zu überprüfen, indem man die IP-Adresse und die aktuelle Zeit als Dateinamen verkettet und einfach ein einzelnes Zeichen anhängt Erhöhen der Dateigröße um 1 Byte bei jeder Anforderung. Hier ist ein Testskript, das ich geschrieben habe und mit dem Sie herumspielen können, um sich einen Überblick zu verschaffen:

$limit      = 400;
$requests   = 1000;
$log_file   = '/tmp/ip_'.$_SERVER['REMOTE_ADDR'].'_'.time();
$ban_file   = '/tmp/ban_'.$_SERVER['REMOTE_ADDR'];

for($i = 0; $i < $requests; $i++){
    clearstatcache();
    if(file_exists($ban_file)){
        echo "<h1>you've been banned</h1>"; 
        exit;
    }
    $log = fopen($log_file, "a"); 
    fwrite($log,'0');
    fclose($log);       
    if(filesize($log_file) > $limit){
        $log = fopen($ban_file, "w"); 
        fwrite($log,NULL);
        fclose($log);
    }
    else{
        echo filesize($log_file).'<br/>';
    }
}
echo 'final '.filesize($log_file).'<br/>';

Führen Sie dies mit $ orders <$ limits aus und Sie werden sehen, dass alles in Ordnung ist, egal wie oft Sie aktualisieren. Wenn Sie $ orders> $ limits ändern, wird der Vorgang beendet, sobald die Dateigröße 401 Byte erreicht. Aktualisieren Sie erneut und Sie werden sehen, dass Sie sofort gesperrt sind!

Es ist wichtig, den Clearstatcache zu haben (); Andernfalls speichert PHP die anfänglichen Ergebnisse für Dateigröße und Datei_existiert im Cache und meldet weiterhin, dass 1 Byte & Datei nicht vorhanden ist und Ihr Limit niemals überschreitet oder die Sperrdatei anzeigt. Außerdem müssen Sie regelmäßig ein Cronjob-Skript ausführen, um die alten IP-Zählerdateien zu löschen, damit sie nicht zu viel Speicherplatz belegen.

5
WebChemist

Danke für den tollen Code. Ich habe es so modifiziert, dass es 1 Stunde lang nichts ohne Sitzung verbietet, wenn diese Falle aktiviert ist. Ich nenne das die Extreme Flood Trap. Ich weiß, dass ich sogar die guten Bots verbieten werde, was mich zu meiner nächsten Frage führt. Wird es auf lange Sicht schlimme Folgen für die Site haben, die Searchbots mit 403 für eine Stunde zu bedienen? Hier ist der Code bis jetzt -

$limit      = 400;
$log_file   = 'ip_'.$_SERVER['REMOTE_ADDR'].'_'.time();
$ban_file   = 'ban_'.$_SERVER['REMOTE_ADDR'];

clearstatcache();
if(file_exists($ban_file)){  
    $banlimit = file_get_contents($ban_file)+3600; 
    if(time() < $banlimit){
        if (!tep_session_id()) {
            header('HTTP/1.1 403 Forbidden');
            exit;
        }
    }
}

//creats a file and addes 1 byte of data on each page request
$log = fopen($log_file, "a"); 
fwrite($log,'0');
fclose($log);    

//if the size of the log file is greater than the Request limit size then create a ban file
if(filesize($log_file) > $limit){
    $log = fopen($ban_file, "w"); 
    fwrite($log,time());
    fclose($log);
}

Was denkst du?? schlechte Wahl??

1
Manish Pradhan