PHP Kurs Logo  
 
Buttons PHP Kurs - Kapitel Trennlinie Downloads Trennlinie Was brauche ich ? Trennlinie Kontakt Trennlinie Impressum & Datenschutz Buttons
 
 
Menu
Allererste PHP Schritte
- Webserver Installation
- PHP Editor Installation

PHP Grundlagen
- PHP Grundwissen
- Mein erstes Programm
- Kommentare einfügen
- Variablen
- PHP+HTML mischen
- If Abfragen
- Rechenarten
- Arrays
- Schleifen
- Funktionen
- Klassen
- Includes
- Sessions und Cookies
- Login mit Sessions
- Login mit Datenbank
- Referer auslesen
- Wert aus Datenbank
- Variablen übergeben

MySQL Grundlagen
- Was ist das ?
- Erste Schritte
- Verbindung herstellen
- Einfache SQL Befehle
- SQL Injection

Häufig gefragt
- Was ist Adwords ?
- Interessante Links
- Wasserzeichen mod_rewrite
- Thumbnails erstellen
- PHP Gästebuch
- PHP Header
- Webseiten auslesen
- Socket Verbindungen
- E-Mail Adressen prüfen
- E-Mails versenden
- $_GET & $_POST
- Datenbank sichern
- Server DDOS Angriffe Abwehren
- Webhosting - Worauf ist zu achten ?

Interessante Artikel
- Cache leeren
- Website mit Video




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:

php tabelle login php

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)

phpmyadmin tabelle login users

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($_resMYSQL_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($_resMYSQL_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.





<<<< zurück Kapitelauswahl vorwärts >>>>






Content
 
  Bottom Design  

PepperTools.de Software Download | Software Shop
unsere eigene Dampfdrache Marke - Liquids zum Dampfen
www.imilkowski.eu - Software Programmierung und Webdesign