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 - 2013 | Last Update: 29.11.2001