Loginscript



Buchtipp: Das Design-Buch für Nicht-Designer

Diese Codebeispiel zeigt euch, wie ihr MySQL und Sessions verwendet um eine sicheren Login-Bereich für eure Website zu haben. Solltet ihr die Nutzerdaten bisher in eine Textdatei abgespeichert haben, so solltet ihr schnellstmöglich umsteigen und MySQL verwenden. Dieses Script könnt ihr hier herunterladen.

Datenbankstruktur

Als erstes legt ihr mittels phpMyAdmin eine neue Tabelle an. Ihr könnt dabei die gleiche Tabelle wie bereits aus dem MySQL-Tutorial verwenden:

Beziehungsweise der nötige SQL-Code für diese Tabelle ist:

 

Als nächstes erzeugt ihr eine neue Zeile in eurer Tabelle für einen neuen Benutzereintrag. Tragt in die Tabelle mittels phpMyAdmin einen neuen Test-Benutzer ein, beispielsweise mit den Daten:
E-Mail: test@test.de
Passwort: $2y$10$qCgb4MKzbMKAqUU2LOFBQ.wGoAD6yBElFA7V7EPwK.QGCViJjx4mu

Das kryptisch aussehende Passwort ($2y$10$qCgb4MKzbMKAqUU2LOFBQ.wGoAD6yBElFA7V7EPwK.QGCViJjx4mu) ist dabei der password_hash-Hashwert vom Passwort test. Diesen Wert könnt ihr mit unserem Hashwert Generator erzeugen. Ihr solltet Passwörter niemals im Klartext abspeichern. Ein Angreifer könnte sonst bei einem Diebstahl eurer User-Tabelle großen Schaden anrichten. Das Abspeichern als Hashwert bietet dabei einen gewissen Schutz gegen Angriffe. Mehr Infos zu dem Thema findet ihr im Artikel Passwörter sicher speichern sowie in unserem Tutorial PHP Sicherheit.

Damit ihr die password_hash()-Funktion nutzen könnt, müsst ihr bzw. eurer Webhoster mindestens PHP 5.5 nutzen. Falls ihr PHP >= 5.3.7 oder PHP 5.4 noch verwendet, ladet die password.php herunter und bindet diese per include("password.php");  zu Beginn eurer Scripts ein.

 

Dateiaufbau

Für dieses Beispiel benötigt ihr die folgenden Dateien:

  • registrieren.php - Eure Datei für die Benutzerregistrierung
  • login.php - Eure Datei für den Login
  • geheim.php - Euer geschützter Bereich

Registrierung

Das komplette Script für die Registrierung sieht wie folgt aus. Weiter unten findet ihr eine genauere Erläuterung.

Wir starten die Registrierung indem wir zuerst session_start() aufrufen und dann eine Verbindung zur Datenbank aufbauen. Hier haben wir als Datenbank test gewählt mit dem Datenbanknutzer root und einem leeren Passwort.

Das Formular zur Registrierung beginnt ab Zeile 50. Um zu steuern ob wir das Registrierungsformular ausgeben wollen haben wir die Variable $showFormular definiert. Standardmäßig (Zeile 13) ist der Wert true. Das Registrierungsformular ist ein schlichtes HTML-Formular welches die Daten an die eigene Seite sendet, aber zusätzlich noch den GET-Parameter register=1 mit übergibt. So können wir später leicht überprüfen, ob Daten für die Registrierung gesendet wurde (Zeile 15).

Mittels isset($_GET['register']) in Zeile 15 überprüfen wir ob der GET-Parameter übergeben wurde, sprich, ob das Formular für die Registrierung abgesendet wurde. Danach fragen wir die Daten aus dem Formular ab und überprüfen zum einem mittels filter_var() ob die E-Mail-Adresse gültigt ist und dass die zwei Passwörter identisch sind.  Sollte kein Fehler aufgetreten sein, so führen wir die Registrierung durch.

Ab Zeile 35 überprüfen wir, dass die E-Mail-Adresse noch nicht in der Tabelle vorhanden ist. Dazu senden wir einen entsprechenden SELECT-Query an die Datenbank und falls ein Benutzer gefunden wird, sprich, falls $user !== false, geben wir die Fehlermeldung zurück, dass die E-Mail-Adresse bereits vergeben ist.

Wie oben beschrieben berechnen wir erst mittels password_hash() den Hashwert des Passworts. Danach bereiten wir unseren SQL-Query vor zum Eintrag des neuen Nutzers (mehr Infos zum Thema Daten einfügen). Sollte alles geklappt haben, so geben wir eine Erfolgsmeldung aus und setzen die Variable $showFormular auf false. Dadurch verhindern wir im Erfolgsfall, dass das Registrierungsformular nochmal ausgegeben wird.

Übungsaufgabe

  • Erweitert das Registrierungsformular um weitere Felder, z.B. für den Vorname und den Nachname

 

Login

Unsere login.php ist ziehmlich einfach aufgebaut:

Sollte das Login-Formular abgesendet worden sein, sprich, wenn der GET-Parameter login gesetzt ist, fragen wir zuerst die Datenbank nach der entsprechenden E-Mail-Adresse ab. Sollte kein Benutzer gefunden worden sein, so hat der $user den Wert false.

Um das Passwort zu überprüfen nutzen wir den folgenden Code:

password_verify($benutzer_eingabe, $gespeichertes_passwort)

password_hash() erzeugt bei mehrmaligem Aufruf unterschiedliche Hashwerte selbst bei identische Passwörtern. Deswegen funktioniert es nicht, nur die Benutzereingabe zu hashen und diesen Hashwert zum existenten Hashwert zu vergleichen. Mit der obigen Variante funktioniert aber das Abgleich des Passworts.

Sollte also ein Nutzer gefunden worden sein und sollte das Passwort stimmen, so registrieren wir die Session-Variable userid mit der ID des Benutzers und beenden den weiteren Script-Verlauf.

Geschützer Bereich

Für unseren geschützen Bereich (geheim.php) müssen wir nur überprüfen, ob die Session-Variable userid existiert. Falls nicht, weisen wir den Nutzer darauf hin, dass sich dieser zuerst registrieren muss.

Diesen Codeschnipsel müsst ihr nun nur einfach in jede eurer geschützen Seiten einbauen.

Logout

Solltet ihr noch an einem Logout interessiert sein, so fügt einfach in eine neue Datei, beispielsweise in die logout.php folgenden Code ein:

 

Autor: