Session Variante sicher?
Andavos
- php
Hallo,
wollte nur mal fragen, ob meine Session wariante sicher ist, oder ob man die ganz einfach umgehen kann.
Also man hat ein Forumular.
Dort gibt man Username + PW an. Das wird dann überprüft
if(//Alles OK)
{
session_register('zaehler');
$zaehler = "User"; //Nur ein Beispiel
}
Später überprüfe ich das dann wieder:
if(session_is_registered('zaehler'))
{
if($zaehler=="User")
{
//Alles OK
}
}
Ist das Sicher oder kann man das ganz einfach überbrücken?
MFG
Andavos
Hello,
Also man hat ein Forumular.
Dort gibt man Username + PW an. Das wird dann überprüft
Das sind ZWEI Schlüssel.
Nun startet die Session und Du hast nur noch EINEN Schlüssel. Einen Schlüssel kann man aber raten, ohne dass das Programm das erkennen kann. Wie hoch die Wahrscheinlichkeit ist, dass dieser Schlüssel erraten wird, dafüber gibts hier dutzende Threads. Aber es ist zumindest theoretisch unsicher.
Beim Zweischlüsselverfahren kann man die Fehlversuche für das Erraten des Paares unter einem der beiden Schlüssel ablegen. Das ist meistens der Loginname. Wenn mehr als z.B. drei Fehlversuche stattgefunden haben, kann man das Login z.B. für eine halbe Stunde oder sogar ganz sperren.
Damit keiner Schindluder treibt, sollte man auch Loginnamen wie Passwörter behandeln.
if(//Alles OK)
{
session_register('zaehler');
Diese Funktion sollte man seit PHP 4.1.x nicht mehr verwenden.
$zaehler = "User"; //Nur ein Beispiel
}Später überprüfe ich das dann wieder:
if(session_is_registered('zaehler'))
{if($zaehler=="User")
{
//Alles OK
}}
Ist das Sicher oder kann man das ganz einfach überbrücken?
Nein, das ist nicht sicher. Ja, das kann man überbrücken, indem man die richtige Sessionnummer errät oder einfach aus dem Script ausliest (bei TRANS_SID = 1).
"Sicher" ist nur ein Zweischlüsselverfahren, bei dem bei jedem Zugriff die Login-Rechte aufs Neue geprüft werden.
Grüße
Tom
Hallo,
Meinst du so:?
if(//Alles OK)
{
session_register('zaehler');
$zaehler = "User|PW"; //Nur ein Beispiel
}
Später überprüfe ich das dann wieder:
if(session_is_registered('zaehler'))
{
$z = explode("|", $zaehler);
if($z[0]=="User" and $z[1]=="PW aus der DB")
{
//Alles OK
}
}
Ist das jetzt sicher?
Aber wenn man die Session ID errät, kommt man dann so ins Admin Menü? Muss man nicht vorher noch den zaehler noch auf "User" stellen?
MFG
Andavos
Moin!
Also man hat ein Forumular.
Dort gibt man Username + PW an. Das wird dann überprüftDas sind ZWEI Schlüssel.
Nun startet die Session und Du hast nur noch EINEN Schlüssel. Einen Schlüssel kann man aber raten, ohne dass das Programm das erkennen kann. Wie hoch die Wahrscheinlichkeit ist, dass dieser Schlüssel erraten wird, dafüber gibts hier dutzende Threads. Aber es ist zumindest theoretisch unsicher.
Einspruch. :)
Natürlich macht es _vielleicht_ Sinn, die Anzahl fehlerhafter Login-Versuche mitzuzählen. Die andere Seite der Medaillie ist dann aber, dass eine Sperrung sich wunderbar eignet, als Denial-of-Service ausgenutzt zu werden, damit eine fremde Person durch falsche Logins alle User aussperren kann. Das wäre blöd.
Wenn nun aber das Aussperren von Usern nicht geschehen darf, bleibt als Resultat für den Angriff nur die Notwendigkeit, eine gewisse Anzahl von Zeichen zu raten.
Es ist, ausgehend von diesem Standpunkt, egal, ob man nun "username+passwort" als Insgesamt-String richtig raten muß, oder ob es "sessionid" ist. Hauptsache, man hat viele Möglichkeiten, zu raten, damit es der Angreifer nicht zu leicht hat.
Die PHP-Sessions nutzen eine 128-Bit-Zahl (in hexadezimaler Darstellung) als ID. Also sind 2^128 verschiedene IDs möglich. Grob 3,4028236692093846346337460743177e+38 verschiedene Möglichkeiten.
Mal überschlagsmäßig gerechnet: Man kann nur aktive Sessions "übernehmen". Gehen wir mal von einer Milliarde aktiver Sessions aus (was immerhin ein sechstel oder siebtel der Weltbevölkerung ist, die _gleichzeitig_ auf dem Server rummachen würde). Dann hat man durchschnittlich schon nach 3,4e+29 Versuchen eine aktive Session-ID gefunden. Wie lange braucht man dafür? Wenn man pro Sekunde wiederum genau eine Milliarde Session-IDs prüfen könnte, würde man 3,4e+20 Sekunden brauchen, um durchschnittlich mit Sicherheit eine aktive ID zu finden, vielleicht auch nur die Hälfte der Zeit: 1,7e+20 Sekunden. Also grob 5e+12 Jahre (in Worten: 5 Billionen Jahre). Da ja mindestens 128 Bit = 32 Byte an Daten zur Übermittlung der Session-ID übertragen werden müßten, benötigte man dafür eine Datenrate von 3,2 Gigabyte pro Sekunde - das wäre immerhin schaffbar. Dummerweise ist ein HTTP-Request nicht so klein, alleine das würde also die Anzahl der Tests pro Sekunde beschränken.
Natürlich kann man auch durch dummen Zufall gleich beim ersten Versuch richtig raten und spart sich die restlichen 5 Billionen Jahre. Dann allerdings sollte man auch unbedingt Lotto spielen, da sind die Chancen, mal 6 Richtige mit Zusatzzahl zu kriegen, wahnsinnig viel höher.
Eine Session-ID hat außerdem den Vorteil, dass man sie nicht über social engineering rauskriegen kann, weil sie von einer Maschine generiert wird und hoffentlich ziemlich zufällig gewählt ist.
Damit keiner Schindluder treibt, sollte man auch Loginnamen wie Passwörter behandeln.
Das ist genau das Problem, bzw. Kern der Sache: Der Username ist wie ein Passwort zu behandeln, weil er Bestandteil des Passwortes ist, ihm sozusagen hinzugerechnet werden kann.
Ist das Sicher oder kann man das ganz einfach überbrücken?
Nein, das ist nicht sicher. Ja, das kann man überbrücken, indem man die richtige Sessionnummer errät oder einfach aus dem Script ausliest (bei TRANS_SID = 1).
Falsch. Die Frage ist, wie in der Session der Status "eingeloggt" gesetzt wird. Diese Überprüfung der Authentifizierungsdaten wäre angreifbar - ist hier aber nicht dargestellt.
"Sicher" ist nur ein Zweischlüsselverfahren, bei dem bei jedem Zugriff die Login-Rechte aufs Neue geprüft werden.
Das ist absolut falsch - sofern man sich keine dummen Fehler einbaut, die ausgenutzt werden könnten.
- Sven Rautenberg
Hallo,
du meinst das Verfahren ist sicher???
Außerdem sind da nicht eine Millarden Aktive IDs sondern i.d.R. nur eine (glaub ich)
Das System benutze ich für das Admin CP eines Gästebuches, also so das nicht viele Zugriff darauf haben.
Aber wenn man die Session ID errät, muss man dann nicht noch Zaehler auf "User" setzten, damit das geht?
Oder ist das irgendwie in der Session ID gespeichert?
MFG
Andavos