Frage

Was ist der beste Weg, Bots, böswillige Benutzer zu stoppen, usw. von der Ausführung zu schnell PHP-Skripte? Ist es in Ordnung, wenn ich die usleep() oder sleep() Funktionen verwenden, um einfach zu tun „nichts“ für eine Weile (kurz vor dem gewünschten Code ausführt), oder ist das einfach dumm und es gibt bessere Möglichkeiten für das?

Beispiel:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

Wenn ich nur setzen, sagen wir, usleep(3000000) vor den Login- und Logout-Codes, ist das in Ordnung, oder gibt es bessere, klügere Wege zu erreichen, was ich erreichen will?

Bearbeiten auf die Vorschläge unten Basierend, dann ist usleep oder sleep nur bewirken, dass der Prozessor aus dem aktuellen Skript lösen durch die aktuellen Benutzer ausgeführt wird, oder tut es weil es aus dem gesamten auszurücken Bedienung? das heißt, wenn ein Benutzer + Skript eine sleep / usleep aufruft, werden alle gleichzeitig angemeldeten Benutzer + Skripte zu verzögern?

War es hilfreich?

Lösung

Die Art und Weise die meisten Web-Server arbeiten (Apache zum Beispiel) ist eine Sammlung von Arbeitsthreads zu halten. Wenn ein PHP-Skript ausgeführt wird, ein Thread läuft den PHP-Skript.

Wenn Sie Ihr Skript sleep(100) der Fall ist, nimmt das Skript 100 Sekunden auszuführen .. Das heißt, Ihr Arbeitsthread wird 100 Sekunden lang gebunden.

Das Problem ist, Sie haben eine sehr begrenzte Anzahl von Worker-Threads - sagen Sie 10 Threads haben, und 10 Personen anmelden - jetzt Ihr Web-Server keine weiteren Antworten nicht dienen kann ..

Der beste Weg, Anmeldungen (oder andere Aktionen) zu begrenzen bewerten ist eine Art schnellen In-Memory-Speicher, was zu verwenden ( memcached ist perfekt für diese), aber das erfordert separaten Prozess ausgeführt und ist ziemlich kompliziert (man könnte dies tun, wenn Sie so etwas wie Facebook laufen ..).

Einfachere, könnten Sie eine Datenbanktabelle, die user_id oder ip_address, first_failed und failure_counter speichert.

Jedes Mal, wenn eine ausgefallene die Anmeldung erhalten Sie (in Pseudo-Code) tun würden:

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

Vielleicht nicht die effizienteste, und es gibt bessere Möglichkeiten, aber es sollte Brute-Forcing ziemlich gut zu stoppen. Memcached ist im Prinzip der gleiche, aber die Datenbank mit Memcached ersetzt wird (was schneller ist)

Andere Tipps

  

stoppen Bots, böswillige Benutzer usw.   die Ausführung von PHP-Skripte zu schnell?

Ich würde zuerst fragen, was Sie wirklich zu verhindern versuchen? Wenn es Denial-of-Service-Attacken ist, dann würde ich muss sagen, es gibt nichts, was Sie tun können, wenn Sie sind begrenzt durch das, was Sie PHP-Skripte hinzufügen. Der Stand der Technik ist so viel über das, was wir als Programmierer gegen schützen kann. Beginn der Suche auf Sysadmin Werkzeuge für diesen Zweck entwickelt wurde.

Oder versuchen Sie Ihren Dienst zu begrenzen, so dass echte Menschen darauf zugreifen können, aber Bots können nicht? Wenn ja, würde ich bei einigen „Captcha“ Techniken aus.

Oder versuchen Sie Benutzer von Ihrer Website Polling jede Sekunde der Suche nach neuen Inhalten zu verhindern? Wenn ja, ich untersuchen würde einen RSS-Feed oder eine andere Art und Weise biete sich die Benachrichtigung, so dass sie Ihre Bandbreite nicht auffressen.

Oder ist es etwas anderes?

Im Allgemeinen würde ich weder schlafen sagen () noch usleep () ist ein guter Weg.

Ihre vorgeschlagene Methode wird alle Benutzer zwingen, unnötig zu warten, bevor Sie sich anmelden.

Die meisten LAMP-Server (und die meisten Router / Switches, tatsächlich) bereits konfiguriert sind Denial-of-Service-Angriffe zu verhindern. Sie tun dies durch mehrere aufeinanderfolgende Anfragen von derselben IP-Adresse zu leugnen.

Sie wollen keinen Schlaf in Ihrer PHP setzen. Doing Ihre so groß die Anzahl der gleichzeitigen Anfragen reduzieren dienen kann handhaben, da sie Verbindungen offen gehalten Warte haben werden.

Die meist HTTP-Server verfügt über Funktionen, die Sie aktivieren können DoS-Angriffe zu vermeiden, aber andernfalls, dass Sie sollten nur verfolgen IP-Adressen, die Sie auch zu oft vor kurzem gesehen haben und ihnen ein 403 mit einer Nachricht sie Verbotenen senden bitten, eine Sekunde zu warten.

Wenn Sie aus irgendeinem Grund nicht verlassen REMOTE_ADDR benutzerspezifische sein (alle hinter der gleichen Firewall, etc.) Sie eine Herausforderung in der Login-Formular unter Beweis stellen konnte und machen den Remote-Browser auf sie eine erweiterte Berechnung tun (sagen wir, Faktor für eine Zahl), dass Sie schnell auf der Serverseite überprüfen (mit schnellen Multiplikation).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top