Authentifizierung in PHP

Ein Mitgliederbereich findet sich auf den meisten Websites. Dieser Artikel gibt euch einige Tipps, wie ihr sowohl einen sicheren als auch benutzerfreundlichen Mitgliederbereich erhaltet und vor unangenehmen Überraschungen geschützt seid..

Dieser Artikel stellt nun nur kurz und übersichtlich die Sicherheits- und Usability-Tipps zu den typischen Funktionen eines Mitgliederbereichs dar. Gerne könnt ihr es auch als Checkliste für euren internen Bereich nutzen.

Sichere Registrierung

Für eine sichere Registrierung solltet ihr die folgenden Punkte beachten:

Sicherer Login

Für den sicheren und bequemen Login solltet ihr beachten:

Sichere Passwort-Vergessen-Funktion

Sollte der Benutzer sein Passwort vergessen haben, empfiehlt sich der folgende Ablauf. Wie schon bei der Registrierung solltet ihr niemals einfach per E-Mail ein Passwort versenden.

  1. E-Mail mit zufälligem Code versenden: Hat der Benutzer sein Passwort vergessen, so gibt er bei euch seine E-Mail Adresse ein. Daraufhin generiert ihr einen zufälligen Code der nur eine begrenzte Zeit gültig ist, z.B. für 6 Stunden. Den Code und das Ablaufdatum schreibt ihr in die Datenbank, beispielsweise in die Nutzertabelle. Anschließend sendet ihr eine E-Mail an den Benutzer mit einem Link, der seine User-ID und diesen Code enthält und fordert ihn auf, diese Seite zu besuchen. Ihr solltet wenn jemand sein Passwort vergessen hat diesen Benutzer nicht sperren oder ihm direkt ein neues Passwort vergeben. Dies würde Spaßvögel einladen unschuldige Benutzer aus eurem System auszuschließen.
  2. Aufruf der Website: Nachdem der Benutzer seine E-Mail erhalten hat ruft dieser den Link auf und kommt auf eine spezielle Website. Dort kann er sein neues Passwort eingeben und danach direkt euer System nutzen.
  3. Optional: Geändertes Passwort bestätigen: Nachdem er das neue Passwort gesetzt habt, könnt ihr ihm nochmal eine E-Mail senden, dass sein Passwort geändert wurde. Aber wie schon bei der Registrierung solltet ihr das neue Passwort von ihm nicht per E-Mail versenden.

Für die Passwort-vergessen-Funktion solltet ihr tunlichst Abstand nehmen von den 'Passwort-vergessen-Fragen' o.ä. Diese sind ziemlich unsicher und lassen sich meistens leicht beantworten wenn man den Nutzer kennt.

Passwort und E-Mail Adresse ändern

Sofern ihr in eurem internen Bereich ein Möglichkeit anbietet das Passwort oder die E-Mail Adresse zu ändern, so solltet dies euer Benutzer nur nach erneuter Eingabe des Passworts machen können. Gerne vergisst man sich bei einem öffentlichen Rechner auszuloggen, der nächste Nutzer des PCs könnte dann das Passwort oder die E-Mail Adresse ändern und so dauerhaften Zugang erlangen.  Dieser Rat gilt übrigens auch für alle weiteren sehr kritischen Aktionen die ein Benutzer durchführen könnte, beispielsweise um sein Konto zu löschen etc.

Nach der Änderung des Passworts bzw. der E-Mail Adresse solltet ihr noch eine entsprechende Benachrichtigungsemail an die alte und neue E-Mail-Adresse versenden.

Angemeldet bleiben-Funktion

Eine 'Angemeldet bleiben'-Funktion erhöht die Usability eurer Webanwendung, senkt aber auch die Sicherheit. Für besonders kritische Anwendungen solltet ihr deswegen auf diese verzichten.

Um diese möglichst sicher zu implementieren führt folgende Schritte aus (Implementierung für die Angemeldet bleiben Funktion:

  1. Bietet beim Login die Checkbox 'Angemeldet bleiben' an. Hat der Benutzer diese ausgewählt wird ein zusätzlicher Login-Cookie bei ihm abgespeichert.
  2. Erzeugt zwei sichere Codes, idealerweise mittels openssl_random_pseudo_bytes() , zur Not sonst mit uniqid() . Der erste Code ist der Identifier, der zweite der Securitytoken.
  3. Speichert in einer Tabelle die User-ID, den Identifier sowie den SHA-1 Wert des Securitytokens. Ihr könnt ebenfalls weitere Infos abspeichern wie beispielsweise das Erstellungsdatum o.ä.
  4. Beim Benutzer selbst wird der Identifier und der Securitytoken (als Klartext) als Cookie abgespeichert.
  5. Besucht der Nutzer eure Website erneut und ist noch nicht eingeloggt, so lest ihr aus dem Cookie den Identifier und den Securitytoken aus.
    1. Sollte der Identifier und Securitytoken zu den Daten in der Datenbank stimmen, so loggt ihr den Benutzer ein und erzeugt einen erneuten Securitytoken (den Identifier könnt ihr wiederverwenden). Der neue Securitytoken wird im Cookie und in der Datenbank aktualisiert.
    2. Passt der Securitytoken nicht zu dem Token in der Datenbank, so hat jemand höchst wahrscheinlich die Cookies beim Benutzer gestohlen. In diesem Fall könnt ihr euren Nutzer per E-Mail über den potentiellen Diebstahl warnen.
    3. Ist kein Identifier in den Cookies vorhanden oder passt zu keinem in der Datenbank, dann könnt ihr den Wert ignorieren.

Es kann nützlich sein, eine Möglichkeit dem Nutzer anzubieten alle Angemeldet-Bleiben-Cookies zu löschen. Löscht dazu die entsprechenden Einträge in der Tabelle. Manche Dienste löschen auch alle Einträge wenn der Benutzer sich bewusst für einen Logout entscheidet.

Administrationsbereich

Besonders kritisch ist oft der Administrationsbereich eurer Webanwendung. Hierfür solltet ihr zusätzliche Sicherheitsmaßnahmen vornehmen.