Bei jedem fehlerhaften login, soll etwas in Session[] geschrieben werden, wie teuer wird dies?

05/12/2009 - 16:42 von Peter Siegmann | Report spam
Hallo,

bei jedem fehlerhaften login, soll ein Datetime Objekt in Session[]
geschrieben werden.

Bei einem erneuten fehlerhaften login, wird das gespeicherte Datetime
mit einem aktuellen Datetime.Now verglichen und berechnet, wie lange
der Abstand war. Ist der Abstand zu kurz, wird die IP automatisch
geblockt, da wohl ein Script am Werk war.


Außerdem wird auch ein int in Session[] geschrieben, dass bei jedem
fehlerhaften login inkrementiert wird. Wenn int Objekt = 10, dann wird
die IP geblockt, egal wie lange der Abstand bei den Datetimes war.

Naja, meine Frage ist: Wie teuer wird dies? Ich habe mal den
schlimmsten aller Fàlle ausgerechnet:

Eine Million fehlerhafter logins, ein Datetime Objekt nimmt, sagen wir
mal, 5 KB in anspruch:

Eine Million * 5 KB = 5 GB...

Tja, wenn es also hart auf hart kommt, wird der Server (4GB Ram) wohl
abstürzen oder zumindest durch swapping in die Knie gehen.


Man, das war jetzt viel zusammengeschrieben, meine Frage ist: ist
meine Idee soetwas umzusetzen "gut"?
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
05/12/2009 - 19:05 | Warnen spam
Hallo Peter,

"Peter Siegmann" schrieb:

bei jedem fehlerhaften login, soll ein Datetime Objekt in Session[]
geschrieben werden.



warum grade in die Session? Die ist dafüßr der denkbar ungünstigste
Ort. Application, Cache, Datenbank, ... wàren allesamt besser dafür
geeignet.

Ist der Abstand zu kurz, wird die IP automatisch
geblockt, da wohl ein Script am Werk war.



Wenn es ein Skript bzw. ein Bot ist, dürfte dem die Session so ziemlich
egal sein :)

Außerdem wird auch ein int in Session[] geschrieben, dass bei jedem
fehlerhaften login inkrementiert wird. Wenn int Objekt = 10, dann wird
die IP geblockt, egal wie lange der Abstand bei den Datetimes war.



Kann man zwar machen, bringt aber nix. Bots arbeiten nur, wenns absolut
notwendig ist, mit einer Session.

Eine Million fehlerhafter logins, ein Datetime Objekt nimmt, sagen wir
mal, 5 KB in anspruch:



Öhm, ein Datetime -> ca. 5.000 Bytes? Ok, .NET ist ja an einigen Stellen
schon speicherhungrig aber sooooooooo viel brauchts dann doch nicht :)
SQL Server braucht für einen datetime Wert 8 Byte, bei .NET dürfte es um
àhnliche Werte gehen.

Tja, wenn es also hart auf hart kommt, wird der Server (4GB Ram) wohl
abstürzen oder zumindest durch swapping in die Knie gehen.



Das würde (wenn Du Objekte mit Gigabytes an Daten komplett im Speicher
halten willst) schon viel früher passieren.

Man, das war jetzt viel zusammengeschrieben, meine Frage ist: ist
meine Idee soetwas umzusetzen "gut"?



Nö.

Ich würde die Werte in eine Datenbank schreiben (die letzten 1000 oder
10000 Versuche kann man auch im Cache behalten) und dann mit entsprechenden
Abfragen oder SPs arbeiten, die dir sagen, ob der Loginversuch so durchgehen
kann oder nicht.

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen