Ich umreiße das Szenario:
- Client und Server in Java geschrieben
- Am Anfang des Verbindungsaufbaus muss der Client ein Passwort schicken. Wenn dem Server das Passwort nicht gefällt, wird der Socket geschlossen. Ansonsten fängt die eigentliche Kommunikation an. Im Prinzip braucht der Client also ein Serverpasswort um sich zu qualifizieren. (Diesen Vorgang nenn ich fortan "Login")
Nun folgender Wunsch:
- Wenn ein Client (d.h. eigentlich: eine IP) in einem Zeitraum T (zB: 5 Minuten) sich X mal (zB: 3) versucht mit falschem Passwort einzuloggen, dann soll die IP für einen Zeitrum U (zB: 1 Stunde) gebannt werden.
Meine eigentliche Frage:
- Wie zähle ich X (die falschen Logins) am besten hoch?
Ein paar weitere nennenswerte Fakten:
- (!) Dies ist ein praktisches "Problem", keine Übungsaufgabe. Daher wäre eine effiziente Lösung wünschenswert, nicht einfach "irgendwas das funktioniert"
- Ban-Funktionalitäten gibt es schon. Bans werden in einer SQLite Tabelle gehandhabt (Tabelle "Bans" mit u.a. "IP", "Zeitstempel" und "Dauer")
Meine Lösungs-Ideen:
1) Da der Server eine SQLite Datenbank benutzt, könnte man eine Tabelle "FailedLogins" anlegen. Als Spalten wären insbesondere "IP", "Zeitstempel" denkbar. Dann könnte ich in mit einem SELECT COUNT(*) und einer WHERE-Kondition, die T berücksichtigt, relativ leicht an einen Wert kommen, den ich direkt mit X vergleichen kann und voilà. Mein Bedenken hierbei: Ich erzeuge viel zu viele Daten. Jeder FailLogin in die Datenbank? Muss das sein?
2) Ich könnte die IPs in eine Datei schreiben (plain-txt, xml, irgendwas). Finde ich ehrlich gesagt unsauber. Außerdem dürften potentielle DDOS-Leute Freude daran haben, wenn der Server jedes Mal in einer Datei rumliest und/oder rumschreibt.
3) Ich könnte die IPs irgendwie in einer HashMap speichern und als zweiten Wert vielleicht eine InnerClass mit Zeitstempel und Anzahl Versuche. Der Gedanke daran ist mir aber schon irgendwie unwohl.
4) Andere Ideen?
Da ich mit PHP groß geworden bin wäre meine allererste Idee gewesen den Fail-Counter in die $_SESSION zu schreiben, aber das ist ja eine ganz andere Welt... Ich brauch mal wieder Hilfe dabei reine Java-Gedanken zu bekommen
- Client und Server in Java geschrieben
- Am Anfang des Verbindungsaufbaus muss der Client ein Passwort schicken. Wenn dem Server das Passwort nicht gefällt, wird der Socket geschlossen. Ansonsten fängt die eigentliche Kommunikation an. Im Prinzip braucht der Client also ein Serverpasswort um sich zu qualifizieren. (Diesen Vorgang nenn ich fortan "Login")
Nun folgender Wunsch:
- Wenn ein Client (d.h. eigentlich: eine IP) in einem Zeitraum T (zB: 5 Minuten) sich X mal (zB: 3) versucht mit falschem Passwort einzuloggen, dann soll die IP für einen Zeitrum U (zB: 1 Stunde) gebannt werden.
Meine eigentliche Frage:
- Wie zähle ich X (die falschen Logins) am besten hoch?
Ein paar weitere nennenswerte Fakten:
- (!) Dies ist ein praktisches "Problem", keine Übungsaufgabe. Daher wäre eine effiziente Lösung wünschenswert, nicht einfach "irgendwas das funktioniert"
- Ban-Funktionalitäten gibt es schon. Bans werden in einer SQLite Tabelle gehandhabt (Tabelle "Bans" mit u.a. "IP", "Zeitstempel" und "Dauer")
Meine Lösungs-Ideen:
1) Da der Server eine SQLite Datenbank benutzt, könnte man eine Tabelle "FailedLogins" anlegen. Als Spalten wären insbesondere "IP", "Zeitstempel" denkbar. Dann könnte ich in mit einem SELECT COUNT(*) und einer WHERE-Kondition, die T berücksichtigt, relativ leicht an einen Wert kommen, den ich direkt mit X vergleichen kann und voilà. Mein Bedenken hierbei: Ich erzeuge viel zu viele Daten. Jeder FailLogin in die Datenbank? Muss das sein?
2) Ich könnte die IPs in eine Datei schreiben (plain-txt, xml, irgendwas). Finde ich ehrlich gesagt unsauber. Außerdem dürften potentielle DDOS-Leute Freude daran haben, wenn der Server jedes Mal in einer Datei rumliest und/oder rumschreibt.
3) Ich könnte die IPs irgendwie in einer HashMap speichern und als zweiten Wert vielleicht eine InnerClass mit Zeitstempel und Anzahl Versuche. Der Gedanke daran ist mir aber schon irgendwie unwohl.
4) Andere Ideen?
Da ich mit PHP groß geworden bin wäre meine allererste Idee gewesen den Fail-Counter in die $_SESSION zu schreiben, aber das ist ja eine ganz andere Welt... Ich brauch mal wieder Hilfe dabei reine Java-Gedanken zu bekommen