2009-05-20 10 views
6

Ich arbeite an einer ziemlich großen Website in PHP, die möglicherweise viele Benutzer haben wird. Ich suche nach einer Möglichkeit, den Anmeldebildschirm vor automatisierten Versuchen zu schützen. Ich habe bereits einen CAPTCHA-Check in das Registrierungsformular aufgenommen, möchte aber die Seite noch mehr härten.So verzögern Sie Anmeldeversuche nach zu vielen Versuchen (PHP)

Es wurden ähnliche Fragen auf Stackoverflow, die ich kenne, und ich weiß, ich bin in der Lage, diese selbst von Grund auf neu zu implementieren (Login-Versuche und ihre Zeit in der db zu speichern), aber ich mag nicht diesen Weg:

  • Konzeptionell denke ich, dass diese Art von Logik auf der Web-Server/Infrastruktur-Ebene gehört, nicht auf der Anwendungsebene. Ich mag es nicht, diese Logik und Komplexität in meiner Anwendung
  • Ich sorge mich über die Leistung, insbesondere auf der Datenbankebene.
  • Ich bin faul, in einer guten Art und Weise, durch kein gemeinsames Hilfsprogramm wie dieser von Grund auf neu

Jede beraten geschätzt bauen zu wollen, denke ich, dass ich besonders bin für eine Art von Apache-Modul suchen das kann das tun. Meine Plattform ist PHP5 (mit CodeIgniter), Apache2, MySQL 5.

Antwort

16

Update: Verwenden Sie nicht sleep() für die Begrenzung der Geschwindigkeit! das macht überhaupt keinen Sinn. Ich habe keine bessere Lösung zur Hand.


wäre ein guter Anfang nur sleep(1); nach einem gescheiterten Login-Versuch sein - einfach, fast fehlerfrei zu implementieren.

1 Sekunde ist nicht viel für einen Menschen (vor allem, weil Login-Versuche von Menschen nicht oft versagen), aber 1sec/versuchen Brute-Force ... sloooow! Wörterbuchangriffe können ein anderes Problem sein, aber es ist in der gleichen Domäne.

Wenn der Angreifer auch startet, können Verbindungen, um dies zu umgehen, Sie befassen sich mit einer Art DOS-Angriff. Problem gelöst (aber jetzt hast du ein anderes Problem).

einige Dinge, die Sie berücksichtigen sollten:

  • wenn Sie Konten soley auf einer pro IP-Basis zu sperren, kann es zu Problemen mit privaten Netzwerken sein.
  • wenn Sie Konten soley auf einem Benutzernamen Basis, Denial-of-Service-Attacken agains bekannten Benutzernamen sperren würde
  • Sperren auf IP/Benutzername Basis möglich sein (wobei Benutzername derjenige angegriffen ist) könnte besser funktionieren

mein Vorschlag: vollständige Sperre ist nicht wünschenswert (DOS), so eine bessere Alternative wäre: zählen Sie die Anmeldeversuche für einen bestimmten Benutzernamen von einer eindeutigen IP. Sie könnten dies mit einer einfachen Tabelle failed_logins: IP/username/failed_attempts

tun, wenn die Anmeldung fehlschlägt, wait(failed_attempts); Sekunden. Führen Sie alle xx Minuten ein Cron-Skript aus, das failed_logins:failed_attempts um eins verringert.

Entschuldigung, ich kann keine vorgefertigte Lösung bereitstellen, aber dies sollte trivial zu implementieren sein.

okay, okay.hier ist der Pseudo-Code:

<?php 
$login_success = tryToLogIn($username, $password); 

if (!$login_success) { 
    // some kind of unique hash 
    $ipusr = getUserIP() . $username; 

    DB:update('INSERT INTO failed_logins (ip_usr, failed_attempts) VALUES (:ipusr, 1) ON DUPLICATE KEY UPDATE failed_logins SET failed_attempts = failed_attempts+1 WHERE ip_usr=:ipusr', array((':ipusr' => $ipusr)); 

    $failed_attempts = DB:selectCell('SELECT failed_attempts WHERE ip_usr=:ipusr', array(':ipusr' => $ipusr)); 

    sleep($failed_attempts); 
    redirect('/login', array('errorMessage' => 'login-fail! ur doin it rong!')); 
} 
?> 

Haftungsausschluss: dies nicht in bestimmten Regionen arbeiten. Das letzte, was ich gehört habe, war, dass es in Asien ein ganzes Land gibt (auch alle kennen Kung-Fu).

+0

nette und einfache Lösung Ich stimme zu, aber es erfordert immer noch Datenbank-Interaktion. Was passiert, wenn ich einfach die 1-sekündige Verzögerung zwischen der fehlgeschlagenen Login-Erkennung und dem erneuten Rendern des Anmeldebildschirms hinzufüge? Dies würde sowohl Bots als auch Menschen zwingen, auf die Verzögerung warten zu müssen. Für einen Menschen ist es nicht viel, und nur wenige Menschen werden sich falsch einloggen, während es für einen Bot ziemlich lang ist. Was denken Sie? – Ferdy

+0

das hilft nicht wirklich, weil ich N gleichzeitige Anfragen machen kann. Der 1-Sekunden-Block wird auf Anforderung ausgeführt, sodass die N gleichzeitigen Anforderungen nach etwas mehr als 1 Sekunde abgeschlossen werden (vorausgesetzt, der Server kann die Last verarbeiten). Im Prinzip könnte ich 10.000 Anfragen starten und sie nach einigen Sekunden beenden, weil sie nicht seriell sind. – stefs

+0

auch, es gibt> 80.000 Sekunden pro Tag. 80.000 ist nicht viel für rohe Gewalt, aber es ist wahrscheinlich genug für einen Wörterbuchangriff. – stefs

2

Ein sehr dummes ungetestetes Beispiel, aber ich denke, Sie finden hier die Hauptidee).

if ($unlockTime && (time() > $unlockTime)) 
{ 
    query("UPDATE users SET login_attempts = 0, unlocktime = 0 ... "); 
} 
else 
{ 
    die ('Your account is temporary locked. Reason: too much wrong login attempts.'); 
} 
if (!$logged_in) 
{ 
    $loginAttempts++; 
    $unlocktime = 0; 
    if ($loginAttempts > MAX_LOGIN_ATTEMPTS) 
    { 
     $unlockTime = time() + LOCK_TIMEOUT; 
    } 
    query("UPDATE users SET login_attempts = $loginAttempts, unlocktime = $unlocktime ... "); 
} 

Sorry für die Fehler - ich schrieb es in einigen Anzeigen Sekunden nicht getestet ... Das gleiche Sie von IP tun können, durch Nickname, von Sitzungs_ID etc ...

-3

Warum don Warten Sie nicht mit der "Härtung" und "Skalierung" Ihrer App, bis Sie tatsächlich dieses Problem haben? Das wahrscheinlichste Szenario ist, dass die App niemals "viele Nutzer" haben wird. Das hört sich nach voreiliger Optimierung an, etwas zu vermeiden.

  • Sobald Sie Bots missbrauchen, härten die Anmeldung. Ich würde das Captcha entfernen, bis du anfängst> 1000 Anmeldungen/Tag zu bekommen.
  • Sobald Sie Leistungsprobleme bekommen, verbessern Sie die Leistung, indem Sie echte Engpässe beheben.
+3

Auch wenn Sie konzeptionell recht haben, kennen Sie den Hintergrund meines Projekts nicht und können nicht zu dem Schluss kommen, dass es wahrscheinlich nie diese Probleme bekommen wird. Ich betrachte diese Schutzmaßnahmen als Best Practices unabhängig von der Größe der Website. Wenn ich mich nicht gegen Login-Versuche schütze, können Passwörter gestohlen werden. Wie ist es zu früh, davor zu schützen? Das gleiche gilt für Captchas. Ich benutze meine eigene benutzerdefinierte Blog-Software, sehr viel eine Nische. Ich habe nur 300 Leser und immer noch Bots attackieren es mit Kommentar-Spam. Ein Captcha ist ein Muss in meiner Erfahrung. – Ferdy

+2

Warum kindersicher die Besteckschublade? Warum nicht einfach warten bis das Kind anfängt mit Messern zu spielen? – Twifty

+0

Waldermort, das ist das Beste, was ich heute gelesen habe. – MichaelClark

Verwandte Themen