info@a-coding-project.de

Datenbankbasiertes Login-System mit PHP

Im Internet sind sie ja mittlerweile - speziell bei kommerziellen Angeboten wie Ebay, Amazon oder auch Partnervermittlungen - nicht mehr wegzudenken. Es ist weit verbreitet, dass Anbieter von webbasierten Anwendungen Login und Passwort für ihre Nutzer verwenden.
Der folgende Artikel soll ein Beispiel eines kompletten Loginsystems mit der Registrierung eines Nutzers, dem Login selbst und dem Bereich "Passwort vergessen" für webbasierte Anwendungen vorstellen.

Registrierung

Bevor ein Nutzer eine Anwendung, die mit einem Login-System arbeitet, nutzen kann, muss dieser dem System erstmal seine Daten mitteilen - mit anderen Worten: Er muss sich registrieren. Bei der Registrierung werden alle persönlichen Informationen, die zur Nutzung der Anwendung notwendig sind, in der Datenbank gespeichert. Das folgende Skript zeigt eine Registrierung mit den folgenden persönlichen Informationen: Name, Vorname, Emailadresse, Login und Passwort

<?
$db_server = 'xxx';
$db_name = 'nutzer';
$db_user = 'xxx';
$db_passwort = 'xxx';
@mysql_connect($db_server,$db_user,$db_passwort);
mysql_select_db($db_name);

if(!isset($_POST['sub1']) || empty($_POST['sub1']))
{
 print('<form action="" method="post">
        Name: <input type="text" name="nachname"><br>
        Vorname: <input type="text" name="vorname"><br>
        E-Mail: <input type="text" name="email"><br>
        Loginname: <input type="text" name="kennung"><br>
        Paßwort: <input type="password" name="passwort"><br><br>
        <input type="submit" name="sub1" value="LOGIN">
        </form>');
}
else if($_POST['sub1'] == 'LOGIN')
{
 $check = mysql_db_query('nutzer','SELECT user FROM teilnehmer
                                   WHERE user="'.$_ POST['kennung'].'"');
 $anzeige = mysql_fetch_row($check);
 if($anzeige[0] == $_ POST['kennung'])
 {
  print('<script language="Javascript">
          alert("Die eingegebene Kennung ist bereits vorhanden");
         </script>');
 }
 else
 {
  if(!empty($_POST['passwort']) && !empty($_POST['login']))
  {
   print('<script language="Javascript">
           alert("Ihre Daten wurden übernommen");
          </script>');
   $pers = mysql_db_query("nutzer",'INSERT INTO teilnehmer
           (user, nachname, vorname, email) VALUES
           ("'.$_POST['kennung'].'","'.$_POST['$nachname'].'","'.
               $_POST['$vorname'].'","'.$_POST['$email'].'")');
   $login = mysql_db_query("nutzer",'INSERT INTO login
           (username, passwort, registrierung) VALUES
           ("'.$_POST['kennung'].'","'.$_POST['passwort'].'",NOW())');
   }
   else
   {
    print('<script language="Javascript">
           alert("Ihre Daten konnten nicht übernommen werden");
          </script>');
   }
  }
 }
}
?>

Was macht dieses Skript? Zuerst überprüft es, ob die eingegebene Kennung schon vorhanden ist. Wenn das der Fall ist, wird eine Fehlermeldung ausgegeben und die Registrierung wird abgebrochen.
Wenn die eingegebene Kennung noch nicht vorhanden ist, werden die persönlichen Daten in der Datenbank gespeichert und danach eine Meldung ausgegeben.

Allgemeines zur Datenbank

Alle notwendigen Informationen werden im Beispielsystem in der Datenbank "nutzer" mit den Tabellen "teilnehmer" und "login" gespeichert. Um die Datenbank anzulegen, sind in MySQL folgende Befehle notwendig:

create database nutzer;
use nutzer;
create table teilnehmer (username TEXT, name TEXT, 
                         vorname TEXT, email TEXT);
create table login (username TEXT, passwort TEXT, 
                    registrierung DATETIME);

Das Loginsystem

Will sich ein Nutzer für die Anwendung einloggen, muss er seinen Benutzernamen und sein Passwort eingeben. Die Daten werden dann mit den Informationen in der Datenbank verglichen werden und entsprechend ausgewertet. Fällt dieser Vergleich positiv aus, steht die Anwendung dem Nutzer zur Verfügung - ansonsten bekommt er nur eine Fehlermeldung angezeigt. Dies ist aber nur die "Basis" eines Logins.

Im Folgenden wird ein Beispielskript gezeigt, mit dem das "Basislogin" realisiert werden kann.

<?
$db_server = "xxx";
$db_name = "nutzer";
$db_user = "xxx";
$db_passwort = "xxx";
@mysql_connect($db_server,$db_user,$db_passwort);
mysql_select_db($db_name);

$user = '';
$pass = '';
if(isset($_COOKIE['username'])){$user = $_COOKIE['username'];}
if(isset($_COOKIE['passwort'])){$pass = $_COOKIE['passwort'];}
if(isset($_POST['username'])){$user = $_POST['username'];}
if(isset($_POST['passwort'])){$pass = $_POST['passwort'];}

if($user != '')
{
 $pruefung = mysql_db_query("nutzer",'SELECT passwort FROM login
             WHERE username="'.$user.'"');
 $ausgabe = mysql_fetch_row($pruefung);
 if($pass != $ausgabe[0])
 {
  echo '<p>Username und Passwort stimmen nicht überein.</p>';
  $user = '';
 }
 else
 {
  setcookie("username", $user, time()+3600);
  setcookie("passwort", $pass, time()+3600);
 }
}
if($user = '')
{
 print('<form action="login.php" method="post">
         Login: <input type="text" name="username"><br>
         Passwort: <input type="password" name="passwort"><br><br>
         <input type="submit" name="sub1" value="LOGIN">
        </form>');
 exit;
}
?>

Das Skript liest das in der Datenbank gespeicherte Passwort des eingegebenen Nutzers aus und vergleicht dies mit dem eingegebenen Passwort. Wenn die Informationen zusammen passen bekommt der User einen Cookie gespeichert in dem die Logindaten noch mal vorhanden sind. Dies ermöglicht, dass sich der User nun innerhalb des Angebots aufhalten kann ohne für jede Seite erneut das Passwort eingeben zu müssen.
Stimmen die Informationen aus der Datenbank nicht mit dem eingegebenen Usernamen und Login überein, wird der Vorgang automatisch abgebrochen und stattdessen ein Loginformular angezeigt.

Das Login-Skript einsetzen

Zum Einsatz kommt das Login-Skript ganz einfach indem es als normale PHP-Datei gespeichert wird. Alle (PHP-)Dateien die dann mit einem Login geschützt werden sollen, brauchen dann lediglich um folgende Zeile erweitert werden:

<? include('loginskript.php'); ?>

... vorausgesetzt man hat das Skript als loginskript.php im gleichen Verzeichnis gespeichert.

Speichern der Login-Versuche

Nachdem jetzt das Basis-Login für die Anwendung funktioniert, ist es sinnvoll, die Anzahl der Login-Versuche zu protokollieren. Der Hintergrund dahinter ist es, automatisiertes Abfragen des Logins zu verhindern: Ohne eine Überprüfung der Loginversuche könnte ein Eindringling einfach alle möglichen Kombinationen ausprobieren und würde so früher oder später auch das richtige Passwort finden. Um das zu verhindern wird nach einer bestimmten Anzahl von Fehlversuchen der Zugang für den Nutzer einfach gesperrt wird.

Zunächst muss dazu unsere bestehende Tabelle "login" in der Datenbank um zwei Spalten erweitert werden. Eine Spalte dient zum Speichern der Fehlversuche beim Login und in der zweiten neuen Spalte wird festgehalten, ob der Zugang gesperrt ist. Der zum Ändern nötige SQL-Befehl sieht so aus:

ALTER TABLE login ADD COLUMN (versuche INT(1) DEFAULT "0" 
                              NOT NULL, sperre DATETIME); 

Als zweites muss das PHP-Skript ergänzt werden. Es ist eine Datenbankabfrage notwendig, die den aktuellen Wert in der Spalte "versuche" ausliest und bei mehr als 3 Falscheingaben den Account entsprechend sperrt:

...
if($user != '')
{
 $pruefung = mysql_db_query("nutzer",'SELECT passwort FROM login
             WHERE username="'.$user.'" AND 
             TO_DAYS(sperre) <> TO_DAYS(NOW())');
 $ausgabe = mysql_fetch_row($pruefung);
 if($pass != $ausgabe[0])
 {
  mysql_db_query("nutzer",'UPDATE login SET versuche = versuche+1
              WHERE username="'.$user.'"')

  $pruefung = mysql_db_query("nutzer",'SELECT versuche FROM login
              WHERE username="'.$user.'"');
  $ausgabe = mysql_fetch_row($pruefung);
  if((int)$ausgabe[0] > 3)
  {
   mysql_db_query("nutzer",'UPDATE login SET versuche = 0, 
                            sperre = NOW()
                            WHERE username="'.$user.'"');
   echo '<p>Sie haben mehr als 3 Loginversuche benötigt, der
         Account wird für heute gesperrt.</p>';
  }
  echo '<p>Username und Passwort stimmen nicht überein.</p>';
  $user = '';
 }
 else
 {
  setcookie("username", $user, time()+3600);
  setcookie("passwort", $pass, time()+3600);
 }

...

Passwort vergessen?

Wenn man für die Web-Anwendung das Passwort vergessen hat, kann sich der Nutzer dies per E-Mail zuschicken lassen. Er muss dazu einen eindeutigen Parameter eingeben, damit eine klare Zuordnung zu seiner Person möglich ist. Dieser Parameter kann zum Beispiel die Nutzerkennung, der richtige Name oder die Email-Adresse sein.
Ein Skript, basierend auf der Eingabe der E-Mail-Adresse, welches dem Nutzer automatisch sein Passwort zuschickt, sieht zum Beispiel so aus:

<?
$db_server = "xxx";
$db_name = "nutzer";
$db_user = "xxx";
$db_passwort = "xxx";
@mysql_connect($db_server,$db_user,$db_passwort);
mysql_select_db($db_name);

if(!isset($_GET['name']) || empty($_GET['name']))
{
 print('<form action="vergessen.php" method="post">
        Loginname: <input type="text" name="name"><br>
        <input type="submit" value="Passwort zuschicken">
        </form>');
}
else
{
 $addr=mysql_db_query("nutzer",'SELECT email FROM teilnehmer
                       WHERE username="'.$_GET['name'].'"');
 $mail=mysql_fetch_row($addr);
 $pruefung=mysql_db_query("nutzer","SELECT passwort FROM login
                          WHERE username="'.$_GET['name'].'"');
 $ausgabe=mysql_fetch_row($pruefung);
 mail($mail[0], 'Passwort für Webanwendung xyz',
      'Ihr Passwort lautet: '.$ausgabe[0].'');
}
?>

Weiterlesen: ⯈ YouTube API – Videos suchen

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant