|
PHP Login mit Datenbank Anbindung programmieren
Hier möchte ich erklären, wie man mit Hilfe einer Datenbank wie MySQL einen
Login programmiert. Ihr benötigt eine Möglichkeit eure Datenbank zu bedienen.
Normalerweise stellt einem jeder Hoster PHPMyAdmin (pma) zur Verfügung, welches wir
hier auch weiter benutzen werden.
Als erstes müssen wir unter PHPMyAdmin eine Tabelle erstellen, wo wir alle Zugänge
mit den dazugehörigen Passwörtern speichern. In diesem Fall nenne ich die Tabelle
login_usernamen . Hierbei müssen wir uns noch überlegen welche Felder wir
benötigen. Ich möchte gerne 5 Werte pro User speichern:

Wir sollten jedem User eine eindeutige Nummer zuweisen. Dieses Feld nenne ich id und setze
es als key, sowie auf auto increment, das bedeutet dass bei jedem neuen Eintrag die id
automatisch um 1 hochgezählt wird. Das unsigned bedeutet, dass der Wert niemals Minus ist.
Ein Feld für den Usernamen (username), ein Feld für das Passwort (passwort). Diese beiden
Felder habe ich als Char 25 definiert ; so reserviert MySQL für diesen Dateneintrag immer 25
Bytes, was sich bei großen Tabellen durchaus auf die Performance auswirken tut. Felder die
bei jedem Eintrag unterschiedlich lang sein können, kann MySQL nicht so schnell berechnen
wo sich ein Eintrag befindet, als wenn der Block immer eine bestimmte Größe hat.
Weiterhin haben wir ein user_geloescht, wodrin wir speichern ob dieser User noch Zugang
zu unserem Login hat - also ob er mittlerweile gelöscht wurde oder nicht. Manche würden
den Usereintrag komplett aus der Datenbank löschen. Ich tendiere bei solchen sensiblen Daten
dazu, den Eintrag nur als gelöscht zu markieren und dies abzufragen. Wenn man später etwas
nachvollziehen muss, was ein bestimmter User getan hat, dann kann man dies nicht mehr nachvollziehen
wenn der User komplett aus der Datenbank gelöscht wurde. Wenn der Eintrag nur als gelöscht
markiert ist, dann kann man jederzeit nachvollziehen welcher User dies gewesen ist. Zuletzt speichern wir
noch das Datum/Uhrzeit des letzten Logins in letzter_login . Die PHPMyAdmin Tabelle die wir dort
erstellen kann dann so aussehen: (es werden mehr Felder angezeigt, ich habe dies kleiner gefasst, damit
das hier auf die Seite passt)

So, die Tabelle ist jetzt erstellt und leer. Jetzt müssen wir diese mit Daten füllen.
Wir sollten uns einen Testeintrag machen und klicken in PHPMyAdmin auf Einfügen. Eintragen
brauchen wir nur einen Usernamen und ein Passwort. Dann klicken wir auf OK, um den Eintrag in der
Tabelle zu speichern. Da user_geloescht auf 0 steht, ist dieser Eintrag auch gültig für unser
php Programm, welches wir gleich schreiben werden.
Normalerweise sollte man das Passwort nicht sichtbar in die Datenbank schreiben. Jeder der Zugang zu
der Datenbank hat, kann sich so die Passwörter ansehen. Leute die Sicherheitslücken in euren
Programmierungen finden, können unter Umständen die Passwörter dann auslesen. Normalerweise
sollte man die Passwörter die man dort speichert mindestens einmal mit dem Befehle md5()behandeln, und den Wert den man daraus zurück kriegt als Passwort in der Datenbank speichern. So steht
nur eine wirre Zeichenfolge als Passwort in der Datenbank. Rückrechnen kann man das nicht, aber es gibt
Tabellen im Netz, wo die md5 Werte mit den gängigsten Werten und den dazugehörigen Passwörtern drinne gespeichert sind. Bei zu einfachen
Passwörtern kann es passieren dass Hacker euren MD5 Wert in so einer Tabelle finden und dann das
Passwort ablesen können. Deshalb sollte man kompliziertere Passwörter wählen, oder sogar
vielleicht andere Verschlüsselungsverfahren verwenden, z.B. SHA. Wenn der User einloggt kann man das
Passwort, welches er in das Formular eingegeben hat einmal mit MD5 behandeln und dann mit dem Datenbankeintrag
vergleichen. Dies soll aber nicht Gegenstand
unserer Programmierung werden, da es uns erstmal nur um den Datenbankgestützten Login geht.
Unser Login mit Datenbankanbindung
Jetzt haben wir alle Vorbereitungen getroffen. Wir benötigen nur noch die Zugangsdaten zu
unserer MySQL Datenbank, damit wir uns in PHP in die Datenbank einloggen können. Wir benutzen
zusätzlich noch eine Session
damit wir eine Möglichkeit haben dauerhaft zu speichern, ob der User bereits eingeloggt ist. Ist in
dieser Session nicht gespeichert, dass der User eingeloggt ist, dann bekommt er das Login Formular angezeigt.
Datenbank öffnen: (Datei: login.php)
<?php $_db_host = "localhost"; # meist localhost $_db_datenbank = "datenbankname"; $_db_username = "mysql-username"; $_db_passwort = "mysql-passwort";
SESSION_START();
# Datenbankverbindung herstellen $link = mysql_connect($_db_host, $_db_username, $_db_passwort);
# Hat die Verbindung geklappt ? if (!$link) { die("Keine Datenbankverbindung möglich: " . mysql_error()); }
# Verbindung zur richtigen Datenbank herstellen $datenbank = mysql_select_db($_db_datenbank, $link);
if (!$datenbank) { echo "Kann die Datenbank nicht benutzen: " . mysql_error(); mysql_close($link); # Datenbank schliessen exit; # Programm beenden ! }
################################################################## # Die Datenbank ist geöffnet und die richtige Datenbank ausgewählt # Hier müssen wir nun prüfen, ob der Benutzer eingeloggt ist # und ob das Formular angezeigt werden muss ##################################################################
# Datenbank wieder schliessen mysql_close($link); ?>
|
Was fehlt uns noch ? Wir benötigen ein Formular für den Login und eine Loginprüfung.
Damit das ganze übersichtlich bleibt, machen wir das ganze gleich richtig: Code & HTML
trennen. Wir packen das Formular einfach in eine andere Datei.
Loginformular: (Datei: login-formular.html)
<form method="POST" action="login.php"> Ihr Username: <input name="username"><br> Ihr Passwört: <input name="passwort" type=password><br> <input type=submit name=submit value="Einloggen"> </form>
|
Wir versenden die Daten mit dem Formular über POST und nicht über GET, dadurch werden die
Daten im Header mitgesendet und nicht über die Internetadresse. Das Feld vom passwort ist vom
Typ password, was bewirkt dass bei der Eingabe die Zeichen verdeckt werden.
Wir werden in $_SESSION['login']; speichern, ob der Surfer angemeldet ist oder nicht. Wenn es
auf 1 ist, dann ist er angemeldet, ansonsten bekommt er das Loginformular zu sehen. Weiterhin fragen wir
ab, ob Daten über die Variable $_POST gekommen sind (hier zu mehr in meinem Kapitel POST und GET).
Hierzu fragen wir ab, ob $_POST['submit']; nicht leer ist. Wenn dort etwas drinne steht, dann wurde das
Loginformular benutzt und wir überprüfen, ob die eingegebenen Daten mit einem Logineintrag
übereinstimmen.
Die Abfrage könnte folgendermaßen aussehen:
<?php
# Ist die $_POST Variable submit nicht leer ??? # dann wurden Logindaten eingegeben, die müssen wir überprüfen ! if (!empty($_POST["submit"])) { # Die Werte die im Loginformular eingegeben wurden "escapen", # damit keine Hackangriffe über den Login erfolgen können ! # Mysql_real... ist auf jedenfall dem Befehle addslashes() # vorzuziehen !!! Ohne sind mysql injections möglich !!!! $_username = mysql_real_escape_string($_POST["username"]); $_passwort = mysql_real_escape_string($_POST["passwort"]);
# Befehl für die MySQL Datenbank # Wichtig ist, die Variablen von $_username und $_passwort # zu umklammern. Da wir mit Anführungszeichen den SQL String # angeben, nehmen wir dafür die einfachen Anführungszeichen # die man neben der Enter Taste auf der # findet ! $_sql = "SELECT * FROM login_usernamen WHERE username='$_username' AND passwort='$_passwort' AND user_geloescht=0 LIMIT 1";
# Prüfen, ob der User in der Datenbank existiert ! $_res = mysql_query($_sql, $link); $_anzahl = @mysql_num_rows($_res);
# Die Anzahl der gefundenen Einträge überprüfen. Maximal # wird 1 Eintrag rausgefiltert (LIMIT 1). Wenn 0 Einträge # gefunden wurden, dann gibt es keinen Usereintrag, der # gültig ist. Keinen wo der Username und das Passwort stimmt # und user_geloescht auch gleich 0 ist ! if ($_anzahl > 0) { echo "Der Login war erfolgreich.<br>";
# In der Session merken, dass der User eingeloggt ist ! $_SESSION["login"] = 1;
# Den Eintrag vom User in der Session speichern ! $_SESSION["user"] = mysql_fetch_array($_res, MYSQL_ASSOC);
# Das Einlogdatum in der Tabelle setzen ! $_sql = "UPDATE login_usernamen SET letzter_login=NOW() WHERE id=".$_SESSION["user"]["id"]; mysql_query($_sql); } else { echo "Die Logindaten sind nicht korrekt.<br>"; } }
# Ist der User eingeloggt ??? if ($_SESSION["login"] == 0) { # ist nicht eingeloggt, also Formular anzeigen, die Datenbank # schliessen und das Programm beenden include("login-formular.html"); mysql_close($link); exit; }
# Hier wäre der User jetzt gültig angemeldet ! Hier kann # Programmcode stehen, den nur eingeloggte User sehen sollen !! ?>
|
Die meisten Erklärungen habe ich versucht als Kommentar in die
programmierten Zeilen einzufügen. Erst gucken wir, ob die Post Variable vom
Submit nicht leer ist. Wenn da etwas drinne steht, dann wurden im Loginformular
Daten eingegeben. Diese Daten packen wir in $_username und $_passwort, wobei
wir diese mit mysql_real_escape(); behandeln. Dies bietet Sicherheit
vor Mysql Injections, womit Hacker an eure Datenbank kommen könnten.
Dann Fragen wir in einem einzigen MySQL Befehl ab, ob der Username und das Passwort zu einem
Eintrag passen, wo user_geloescht=0 ist. Mit Limit 1 holen wir maximal nur einen
Eintrag aus der Datenbank, damit MySQL nicht weiter nach weiteren Einträgen sucht, sobald
ein Eintrag gefunden wurde. Lassen wir das weg, dann würde MySQL weiter nach gültigen
Einträgen suchen - dies würde zusätzliche Rechenzeit bedeuten, gerade bei großen
Tabellen mit viel Inhalt.
Man könnte auch erst nur den Usernamen suchen, wo das gelöscht Zeichen auf 0 steht und
diesen Eintrag aus der Datenbank holen und DANN erst vergleichen ob das Passwort stimmt. So könnte
man differenzierter Fehlermeldungen ausgeben - ob der User gar nicht erst existiert, oder ob das
Passwort falsch ist. Ich würde dem Surfer aber nicht unbedingt so detailgetreue Rückmeldungen
geben, so weiss im Zweifel ein Hacker auch ob ein User existiert und braucht nur die Passwörter
weiter durchzuprobieren. Man könnte zur Sicherheit bei der Meldung dass der Login nicht korrekt war
noch einen Zähler mit hochzählen, wie oft er die Fehlermeldung bekommen hat und den Login ab
5 Versuchen komplett für den User sperren, um wenigstens etwas mehr Sicherheit zu bekommen. Hierzu
müsste man noch die IP Adresse für weitere Eingaben sperren, da er ansonsten nur einen neuen
Browser aufmachen müsste, um eine neue Session zu bekommen.
Hier nochmal das komplette Programm: (ohne das Formular)
<?php $_db_host = "localhost"; # meist localhost $_db_datenbank = "datenbankname"; $_db_username = "mysql-username"; $_db_passwort = "mysql-passwort";
SESSION_START();
# Datenbankverbindung herstellen $link = mysql_connect($_db_host, $_db_username, $_db_passwort);
# Hat die Verbindung geklappt ? if (!$link) { die("Keine Datenbankverbindung möglich: " . mysql_error()); }
# Verbindung zur richtigen Datenbank herstellen $datenbank = mysql_select_db($_db_datenbank, $link);
if (!$datenbank) { echo "Kann die Datenbank nicht benutzen: " . mysql_error(); mysql_close($link); # Datenbank schliessen exit; # Programm beenden ! }
##################################################################
# Ist die $_POST Variable submit nicht leer ??? # dann wurden Logindaten eingegeben, die müssen wir überprüfen ! if (!empty($_POST["submit"])) { # Die Werte die im Loginformular eingegeben wurden "escapen", # damit keine Hackangriffe über den Login erfolgen können ! # Mysql_real_escape ist auf jedenfall dem Befehle addslashes() # vorzuziehen !!! Ohne sind mysql injections möglich !!!! $_username = mysql_real_escape_string($_POST["username"]); $_passwort = mysql_real_escape_string($_POST["passwort"]);
# Befehl für die MySQL Datenbank $_sql = "SELECT * FROM login_usernamen WHERE username='$_username' AND passwort='$_passwort' AND user_geloescht=0 LIMIT 1";
# Prüfen, ob der User in der Datenbank existiert ! $_res = mysql_query($_sql, $link); $_anzahl = @mysql_num_rows($_res);
# Die Anzahl der gefundenen Einträge überprüfen. Maximal # wird 1 Eintrag rausgefiltert (LIMIT 1). Wenn 0 Einträge # gefunden wurden, dann gibt es keinen Usereintrag, der # gültig ist. Keinen wo der Username und das Passwort stimmt # und user_geloescht auch gleich 0 ist ! if ($_anzahl > 0) { echo "Der Login war erfolgreich.<br>";
# In der Session merken, dass der User eingeloggt ist ! $_SESSION["login"] = 1;
# Den Eintrag vom User in der Session speichern ! $_SESSION["user"] = mysql_fetch_array($_res, MYSQL_ASSOC);
# Das Einlogdatum in der Tabelle setzen ! $_sql = "UPDATE login_usernamen SET letzter_login=NOW() WHERE id=".$_SESSION["user"]["id"]; mysql_query($_sql); } else { echo "Die Logindaten sind nicht korrekt.<br>"; } }
# Ist der User eingeloggt ??? if ($_SESSION["login"] == 0) { # ist nicht eingeloggt, also Formular anzeigen, die Datenbank # schliessen und das Programm beenden include("login-formular.html"); mysql_close($link); exit; }
# Hier wäre der User jetzt gültig angemeldet ! Hier kann # Programmcode stehen, den nur eingeloggte User sehen sollen !! echo "Hallo, Sie sind erfolgreich eingeloggt !<br>";
##################################################################
# Datenbank wieder schliessen mysql_close($link); ?>
|
Ohne die Kommentarzeilen ist das Programm natürlich viel kleiner. Man kann es in wenige
Zeilen quetschen. Damit Ihr aber nachvollziehen könnt welcher Codeteil wofür ist, habe
ich diese bewusst alle im Text gelassen.
Ich hoffe ich konnte euch damit ein Stückchen näher bringen, wie man die Datenbank
für den Login benutzt.
|