Maresa P.: Authentifizierung/ Passwortschutz über Sessions, Sicherheit?

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.

  1. 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

  2. Hi Maresa,

    1. 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

    1. Moin,

      Dein Programm kann Fehler enthalten die den Sicherheitsmechanismus aushebeln können.

      Ack, deswegen würde ich das etwas robuster gestalten:

      • Die Datenbank nur nach dem Benutzernamen fragen
      • Falls nicht genau ein Datensatz gefunden wird abbrechen
      • Aus dem Datensatz das Passwort auslesen und in PHP mit dem eingebenen Passwort vergleichen

      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.

      --
      Henryk Plötz
      Grüße aus Berlin
      ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
      ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~