PHP4-Forum
Forum | Befehle | MySQL | Beispiele | Newsletter | Suche | Home

Untermenü

Beispiele
Datenbankbasiert
Dateibasierte
Spiele
Sonstige

Zu dieser Seite

Datenbankbasiert
Telefonbuch
Backup einer DB
Import: Datei => DB
Artikelverwaltung
Benutzer-Login
Gästebuch
Newsletterversand
User-Online
Zufällige Auswahl
Forum Software
Newsletter
Login (PHP Modul)
Umfrage
Benutzer-Login für Administrationssysteme

Download | Testen

Um Verzeichnisse mit einem Passwort zu schützen, muss man bei einem Apache-Server nur ein paar Zeilen in die .htaccess eintragen - und schon ist ein Bereich sicher vom Rest der Welt getrennt. Um jedoch ein Administrations-System mit einem Passwort zu schützen, was für viele verschiedene Benutzer mit unterschiedlichen Benutzernamen und Passwörtern erreichbar sein soll, reicht diese simple Art des Schutzes nicht aus. Mit PHP lässt sich in Verbindung mit einer MySQL-Datenbank etwas Derartiges leicht realisieren. Wie dies funktioniert, möchten wir im Folgenden erläutern.

Bei diesem Login-Verfahren verzichteten wir bewusst auf Cookies (da viele User sie nicht annehmen) und die Authentifizierung per HTTP-Header (da dies nur bei der PHP-Modul-Version funktioniert).

Wenn Sie testen möchten, wie das Ganze aussehen könnte, gucken Sie im Bereich Service unter Unserere Angebote nach. Dort verwenden wir ein ähnliches Login-Verfahren zum Administrieren des kostenlosen Gästebuches.

Sollten Sie Fragen zum Script haben, so wenden Sie sich an das Forum.

Und nun folgt die Erklärung:

Sie brauchen zunächst eine Tabelle, in der die Informationen zu den Usern gespeichert werden. Es müssen die Spalten "usr" und "pwd" enthalten sein. Weitere Informationen wie eMail-Adresse o.ä. sind optional. In der Spalte "pwd" werden die Passwörter in verschlüsselter Form gespeichert, sie erhält somit eine Länge von 28 Zeichen. Beispiel-Syntax:
CREATE TABLE user (
  usr CHAR(10) NOT NULL PRIMARY KEY,
  pwd CHAR(28) NOT NULL
)



In einer weiteren Tabelle werden die Informationen über den aktuellen Login gespeichert. Hier werden der Benutzername, eine Nummer die den Benutzer eindeutig identifiziert (uin = user identification number) und den Zeitpunkt, wann der Login nicht mehr gültig ist gespeichert. Aus Sicherheitsgründen werden zusätzlich noch die IP-Adresse und die Browser-Kennung gespeichert. Die UIN wird später aus der mit dem MD5-Verfahren md5() verschlüsselten Unix-Timestamp generiert.
CREATE TABLE login (
  usr CHAR(10) NOT NULL PRIMARY KEY,
  uin CHAR(32) NOT NULL,
  expire INT NOT NULL,
  ip CHAR(15),
  browser CHAR(50),
  UNIQUE (uin)
)


Ein Beispiel-Eintrag für die Tabelle "login" wäre:
usr     = "jan"
uin     = "2fab17291fa7aa3302831c3b094c1ed7"
expire  = "954031617"
ip      = "192.168.1.1"
browser = "Mozilla/4.7 [de]C-CCK-MCD QXW0322g (Win98; I)"


Die login_check.php3 besitzt die zentrale Aufgabe des Login-Verfahrens. Sie überprüft, ob die übermittelte UIN gültig ist. Daher muss login_check.php3 vor jedem Script ausgeführt werden. Dazu muss die allererste Zeile in jedem zu schützenden PHP-Script die folgende sein: <?php require("login_check.php3"); ?>
Alternativ kann auch eine .htaccess erstellt werden, die die folgende Zeile enthalten muss: php3_auto_prepend_file login_check.php3
Dies funktioniert allerdings nur bei Apache mit PHP als Modul!

Achtung: In jeder zu schützenden Datei (wo auch die login_check.php3 per include aufgerufen wird) muss bei den Links zu einer weiteren geschützten Seite die UIN übergeben werden. Der Link sollte dann so aussehen:
<A HREF="datei.php3?UIN=<?php echo $UIN; ?>">bezeichnung</A>

login_check.php3 baut zunächst eine Verbindung zur Datenbank auf. Als erstes werden aus der Tabelle "login" alle Einträge gelöscht, deren Gültigkeit (expire) abgelaufen ist.

Daraufhin wird eine Abfrage gestartet, ob in der Tabelle "login" ein Eintrag vorliegt, der mit der UIN, dem Browser und der IP-Nummer des Benutzers übereinstimmt. Wurde ein Eintrag gefunden, wird der Benutzername ausgelesen und die Zeit, bis wann der Login gültig ist wieder hochgesetzt. Hierbei bietet sich eine halbe Stunde an ($expire = time() + 60*30;). An dieser Stelle können noch weitere Informationen über den Benutzer ausgelesen werden, die in der Tabelle "user" gespeichert sind, damit sie in jeder PHP-Datei als Variablen oder Konstanten verfügbar sind.

Wurde in der Tabelle "login" kein Eintrag gefunden, wird die Datei "login.php3" aufgerufen, welche sich um den eigentlichen Login kümmert.
$EXPIRE = time() + 60*15;
$IP = $REMOTE_ADDR;
$BROWSER = substr($HTTP_USER_AGENT,-50);
$db = @mysql_pconnect("localhost","ID","PASSWORT") or
  die("Verbindung zur Datenbank fehlgeschlagen");
mysql_select_db("DATENBANK-NAME",$db);
mysql_query("DELETE FROM login WHERE expire<".time());
$result = mysql_query("SELECT usr FROM login WHERE
  uin='".addslashes($UIN)."' && ip='$IP' && browser='$BROWSER'");
if(!mysql_num_rows($result)) {
  include("login.php3");
} else {
  $USER = mysql_result($result,0,0);
  mysql_query("UPDATE login SET expire='$EXPIRE' WHERE usr='$USER'");
  // Hier können weitere Infos aus
  // der Tabelle "user" ausgelesen werden
}



Die Datei "login.php3" ist für die Eingabe des Benutzernamens und des Passwortes zuständig, sowie der Zuteilung der UIN.

Zunächst wird in der "login.php3" geprüft, ob bereits Benutzername und Passwort übergeben wurden. Wenn nicht, so wird ein entsprechendes Formular ausgegeben.

Nach Absenden des Formulares wird die "login.php3" erneut aufgerufen und der Benutzername und das Passwort werden übergeben. Es findet nun eine Abfrage statt, welches überprüft, ob ein es eine Kombination der eingegebenen Daten in der Tabelle "user" gibt. Wurde kein Datensatz gefunden, wird die entsprechende Fehlermeldung ausgegeben. Ansonsten wird die UIN berechnet: $UIN = md5(uniqid(rand()));
Daraufhin können die Informationen über den Benutzer in der Tabelle "login" gespeichert werden. Vorher kann jedoch jeder Datensatz mit dem aktuellen Benutzer gelöscht werden, falls es nicht möglich sein soll sich mehrfach einzuloggen.
if(!$USER && !$PWD) {
  echo "<TABLE><FORM METHOD=POST ACTION=\"$PHP_SELF\">";
  echo "<TR><TD>User:</TD><TD><INPUT NAME=USER></TD></TR>";
  echo "<TR><TD>Passwort:</TD><TD><INPUT TYPE=password
    NAME=PWD></TD></TR>";
  echo "<TR><TD></TD><TD><INPUT TYPE=submit VALUE=LogIn></TD></TR>";
  echo "</FORM></TABLE>";
  exit;
} else {
  if(!mysql_num_rows(mysql_query("SELECT usr FROM user WHERE
    usr='".addslashes($USER)."' && pwd='".addslashes($PWD)."'"))) {
    echo "Login inkorrekt";
    exit;
  }
  srand((double)microtime()*1000000);
  $UIN = md5(uniqid(rand()));
  mysql_query("DELETE FROM login WHERE usr='$USER'");
  mysql_query("INSERT INTO login (usr,uin,expire,ip,browser)
    VALUES ('$USER','$UIN','$EXPIRE','$IP','$BROWSER')");
  unset($PWD);
}
Dienstleistungen | Werbung | Impressum | Sitemap | Kontakt | Email © 1999 - 2009 | Last Update: 29.11.2001