Frage

(Dies ist im Prinzip einer sprachunabhängig Frage, obwohl in meinem Fall verwende ich ASP.NET 3.5)

Ich bin mit dem Standard ASP.NET Anmeldekontrolle und möchte die nach gescheiterten Anmeldeversuch Drosselungslogik implementieren.

  • Griff der OnLoginError Veranstaltung und pflegen, in Session , eine Anzahl fehlgeschlagener Anmeldeversuche
  • Wenn diese Zählung wird auf [einige konfigurierbaren Wert] weitere Anmeldeversuche von der Ursprungs-IP-Adresse sperren oder für den Benutzer / die Benutzer für 1 Stunde

Dies klingt wie ein sinnvoller Ansatz? Bin ich ein offensichtliches Mittel fehlen, durch die solche Kontrollen umgangen werden könnten?

Hinweis: ASP.NET Session wird mit dem Browser des Benutzers zugeordnet ist ein Cookie mit

Bearbeiten

Dies ist für eine Verwaltung Website, die nur aus Großbritannien und Indien

verwendet werden soll
War es hilfreich?

Lösung

Jeff Atwood eine anderen Ansatz erwähnt: Eher ein Kontos nach einer Anzahl von Versuchen als Sperre, erhöhen Sie die Zeit bis zur ein anderer Login-Versuch ist erlaubt:

1st failed login    no delay
2nd failed login    2 sec delay
3rd failed login    4 sec delay
4th failed login    8 sec delay
5th failed login    16 sec delay

Das wäre das Risiko verringern, dass diese Schutzmaßnahme für Denial-of-Service-Angriffe missbraucht werden kann.

Siehe http://www.codinghorror.com/blog/archives/001206. html

Andere Tipps

Das letzte, was Sie tun möchten, wird in einer Datenbank alle erfolglosen Login-Versuchen zu speichern, das wird gut genug funktionieren, aber macht es auch extrem trivial für DDoS-Angriffe Datenbankserver zu Fall bringen.

Sie sind wahrscheinlich irgendeine Art von Server-seitigen Cache auf Ihrem Webserver, Memcached oder ähnliches verwendet wird. Das sind ideale Systeme für die Verfolgung von Fehlversuchen von IP-Adresse und / oder Benutzernamen zu verwenden. Wenn ein bestimmter Schwellenwert für fehlgeschlagene Anmeldeversuche überschritten ist, können Sie dann entscheiden, das Konto in der Datenbank zu deaktivieren, aber Sie werden eine Reihe von liest und schreibt auf Ihre persistenten Speicher für die fehlgeschlagene Login-Zähler gespart werden, die Sie brauchen nicht zu bestehen bleiben.

Wenn Sie versuchen, die Menschen von Brute-Forcing-Authentifizierung zu stoppen, ein Drosselsystem wie Gumbo vorgeschlagen wahrscheinlich am besten funktioniert. Es wird Brute-Force-Angriffe auf die Angreifer macht uninteressant, während Auswirkungen für legitime Benutzer unter normalen Umständen zu minimieren oder sogar während eines Angriff vorgeht. Ich würde vorschlagen, nur erfolglose Versuche von IP in Memcached oder ähnlich zu zählen, und wenn Sie jemals das Ziel einer extrem verteilten Brute-Force-Attacke worden ist, kann man immer auch dafür entscheiden, die Verfolgung der Versuche pro Benutzername zu beginnen, unter der Annahme, dass die Angreifer sind tatsächlich versuchen oft den gleichen Benutzernamen. Solange der Versuch nicht sehr verbreitet ist, wie in noch aus einer abzählbaren Menge von IP-Adressen kommen, die anfänglichen by-IP-Code soll mich als ziemlich angemessen Angreifer halten.

Die wichtigsten Fragen mit Besuchern aus Ländern mit einer begrenzten Anzahl von IP-Adressen zu verhindern, ist nicht Ihre Schwellen zu streng zu machen; wenn Sie nicht mehrere Versuche in ein paar Sekunden erhalten, haben Sie wahrscheinlich nicht viel über erneute Sorgen zu machen. scripted Brute-Forcing. Wenn Sie mehr mit Menschen versuchen, andere Benutzer-Passwörter manuell zu entwirren, können Sie breitere Grenzen für nachfolgende fehlgeschlagener Anmeldeversuche nach Username festgelegt.

Ein weiterer Vorschlag, dass Ihre Frage nicht beantworten, aber ist etwas verwandt, ist ein gewisses Maß an Passwort-Sicherheit auf dem Endnutzer zu erzwingen. Ich würde nicht mit erfordern einen gemischten Fall mindestens x Zeichen, nicht-Wörterbuch, etc. etc. Passwort über Bord gehen, weil Sie nicht auf Fehler Menschen zu viel wollen, wenn sie noch nicht einmal unterzeichnet, aber einfach Leute mit ihren Benutzernamen als Passwort zu stoppen einen sehr langen Weg gehen sollten Ihren Service und Anwender gegen die meisten unverfälscht zu schützen - erraten, warum sie sie Brute-Force nennen;) - Angriffe

.

Die akzeptierte Antwort, die zunehmenden Verzögerungen in aufeinanderfolgende Anmeldeversuche einfügt, kann nur sehr schlecht in ASP.NET ausführen, je nachdem wie es umgesetzt wird. ASP.NET verwendet einen Thread-Pool Service-Anfragen. Sobald dieser Thread-Pool erschöpft ist, werden eingehende Anforderungen in der Warteschlange, bis ein Thread verfügbar wird.

Wenn Sie die Verzögerung einfügen mit Thread.Sleep (n), werden Sie einen ASP.NET-Threadpool-Thread für die Dauer der Verzögerung binden. Dieser Thread wird nicht mehr verfügbar sein, andere Anforderungen auszuführen. In diesem Szenario wäre ein einfacher DOS-Stil Angriff Ihr Login-Formular zu halten einreichen. Schließlich verfügbar jeden Thread ausführen Anfragen werden schlafen (und für Zeiträume erhöht wird).

Die einzige Möglichkeit, die ich denken kann, um diesen Verzögerungsmechanismus richtig zu implementieren ist einen asynchronen HTTP-Handler zu verwenden. Siehe Exemplarische Vorgehensweise: Erstellen eines asynchronen HTTP-Handler . Die Umsetzung würde wahrscheinlich müssen:

  1. Authentifizierung versuchen während BeginProcessRequest und bestimmen die Verzögerung bei Ausfall
  2. Gibt einen IAsyncResult ein Waithandle auszusetzen, die nach der Verzögerung ausgelöst werden
  3. Stellen Sie sicher, dass das Waithandle ausgelöst wurde (oder Block, bis es war) in EndProcessRequest

Dies könnte möglicherweise Ihre echten Benutzer bewirken. Für ex. in Ländern wie Singapur gibt es begrenzte Anzahl von ISPs und eine kleinere Menge von IP-Adressen, die für Heimanwender zur Verfügung stehen.

Alternativ könnten Sie möglicherweise ein Captcha einfügen nach x Fehlversuchen Script Kiddies zu vereiteln.

Ich glaube, Sie werden die Zählung außerhalb der Sitzung halten müssen - sonst der triviale Angriff Cookies ist vor jedem Login-Versuch löschen

.

Ansonsten wird eine Zählung und Aussperrung ist sinnvoll - obwohl eine einfachere Lösung sein könnte, eine Verdoppelung-Timeout zwischen jedem Loginfehler zu haben. das heißt 2 Sekunden nach dem ersten Anmeldeversuch, 4 Sekunden nach dem nächsten, 8 etc.

Sie die Timeout-Implementierung von Anmeldungen in der Timeout-Zeit verweigern - auch wenn der Benutzer das korrekte Passwort gibt -. Nur antwortet mit Menschen lesbarer Text sagt, dass das Konto gesperrt-out

Auch Monitor für gleiche IP / verschiedene Benutzer und denselben Benutzer / andere IP.

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