Authentifizierung/ Passwortschutz über Sessions, Sicherheit?
Maresa P.
- php
Hallo,
ich plane einen Teil meiner Website nur nach Login dem User zugänglich zu machen.
Die Benutzernamen und Passwoörter sind in einer MySQL Datenbank gespeichert.
Ich plane jetzt, die Authentifizierung über eine Session laufen zu lassen. Schritt für Schritt würde das dann so aussehen:
1. Benutzer gibt Benutzername/ Passwort in ein Formular ein, welches an eine 2. Date gesendet wird
2. Die Datenbank wird nach den übermittelten Formularwerten durchsucht (Datensätze ausgeben wo Username = post[username] UND passwort = post[passwort].
-> wir mind 1 Datensatz gefunden: Session starten und Benutzername in Session registrieren
-> wird kein Datensatz gefunden: Weiterleitung zum Formular
Auf jeder zu schützenden Seite wird nun abgefragt, ob die Variable benutzername ($_SESSION["benutzername"]) in der Session vorahnden ist.
Fragen:
1. Wie sicher ist das?
2. Kann ein Session durch den Benutzer manipuliert werden, wenn ja: wie?
3. Gibt es Alternativen, Verbesserungsvorschläge?
Vielen Dank
Maresa P.
Hallo,
ich verwende dieses Beispiel:
http://www.php4-forum.de/beispiele/login.htm
bin damit sehr zufrieden und es ist auch gut sicher ...
unter http://content.readyit.de/gast kannst du dir es live anschauen.
Gruß
Marcus
Hi Maresa,
- Wie sicher ist das?
Der Übertragungsweg ist unsicher. (Abhilfe wäre https)
Die Sessions können von anderen benutzt werden (wenn sie in der URL mitgeführt werden: Verbreitung durch Referer oder Veröffentlichung von URLs) (Verbesserung: nur Cookies für die Session ID zulassen.)
Falls jemand anderes Zugriff auf den selben Browser hat (Internetcafe) muß der 'Vorgänger' sich ausgeloggt haben!
Dein Programm kann Fehler enthalten die den Sicherheitsmechanismus aushebeln können.
Alernative ist Zugriff mittels http-Authentification (oft .htaccess), der Vorteil ist das der Schutz ziemlich gut getestet ist.
Gruss,
Carsten
Moin,
Dein Programm kann Fehler enthalten die den Sicherheitsmechanismus aushebeln können.
Ack, deswegen würde ich das etwas robuster gestalten:
Der Grund dafür ist dass das dann auch bei einigen gern gemachten Fehlern sicher bleibt. Es ist zum Beispiel in der Vergangenheit oft vorgekommen, dass ein Angreifer über die Datenbankabfrage SQL-Code einschleusen konnte[1] der dann einfach aus der Abfrage ein SELECT ... WHERE username = ... OR 1 = 1 gemacht hat. Somit hat die Datenbank in jedem Fall etwas zurückgeben und der Schutz war nutzlos.
Oder wenn du nicht die für SQL besonderen Zeichen maskierst, könnte jemand ... WHERE password = '%' ... [2] zusammensetzen, was dann für das PHP-Skript auch in Ordnung aussehen würde.
Alernative ist Zugriff mittels http-Authentification (oft .htaccess), der Vorteil ist das der Schutz ziemlich gut getestet ist.
Der Nachteil ist dass das Passwort dann in jedem Request im Klartext mitgesendet wird[3] und ein Sniffer so unter Umständen mehr Gelegenheiten bekommt es abzuhören. Von der Unmöglichkeit eines sicher funktionierenden serverseitigen Logouts ganz zu schweigen.
[1] Selbstverständlich wirst du dich bemühen das unmöglich zu machen indem du alle Werte von aussen in der Abfrage in Anführungszeichen einsschliesst und darauf achtest dass diese keine unmaskierten Anführungszeichen enthalten.
[2] Bzw. das gleiche mit dem Usernamen und dann einfach verschiedene Passwörter ausprobieren, irgendeiner der User wird schon ein schwaches Passwort haben.
[3] Zumindest solange man den IE nicht ignorieren und Digest Access Authentication nehmen kann.