Dieser Beitrag soll die Grundzüge eines Loginsystems auf der Grundlage von PHP und mySQL erklären.
Die verwendeten Codebeispiele und SQL-Statements erheben
nicht den Anspruch 100% fehlerfrei zu sein, also bitte nicht wundern, falls ein parse error auftauchen sollte (Ich hab's nich so mit Komma(s|tata) )
Sodele, jetzt geht's aber los...
Inhaltsverzeichnis:- Sinn und Zweck
- Gründe für PHP und mySQL
- Aufbau der Tabelle
- Das Passwort
- Der Beispieluser
- Das Loginformular
- Das Einloggen
- Die Prüfung
- Das Ausloggen
- Der Schluss
1 Sinn und Zweck
Der Sinn und Zweck einer Benutzerverwaltung sollte wohl jedem klar sein. Grob gesagt sprechen folgende Gründe dafür:
Der Webmaster kann
- entscheiden, wer wann welche Teile der Seite zu sehen bekommt (inkl. Downloads)
- nachvollziehen, welcher Benutzer wann wo war
- nachvollziehen, wer wann was gemacht hat
- Benutzer, die sich etwas zu Schulden kommen ließen, sperren
- ganz allgemein gesagt entscheiden, dass Herr X bestimmte Aktionen machen darf, Herr Y andere und Herr Z nur ein paar der Aktionen die Herr X machen darf
2 Gründe für PHP und mySQL
Der Login (als ein Bauteil einer Benutzerverwaltung) muss auf dem Server ablaufen, auf dem die Seiten gespeichert sind. Das impliziert die Voraussetzung, dass eine Möglichkeit gegeben sein muss, auf dem Server Benutzereingaben auszuwerten und entsprechend darauf zu reagieren.
PHP ist eine kostenlose Skriptsprache, die von vielen Webhostern zur Verfügung gestellt wird und serverseitige Aktionen erlaubt. Die Syntax ist an C angelehnt, jeder, der damit schon Erfahrung hat, wird sich sofort zurecht finden, jeder andere wird es schnell lernen.
An dieser Stelle sei kurz auf
http://www.php.net verwiesen und dort insbesondere auf das Handbuch (neudeutsch Manual)
Die Daten für den Login, gegen die die Eingaben des Benutzers zum einloggen abgeprüft werden, müssen natürlich auch gespeichert werden. Hierzu gibt es (wie so oft) mehrere Möglichkeiten:
- Die Daten werden direkt im Skript gespeichert
o Am einfachsten zu realisieren, aber wehe, es kommen Benutzer hinzu oder es sollen Passwörter geändert werden
o Ganz zu schweigen von den oben erwähnten Funktionen
o
- Die Daten werden in Textdateien gespeichert
o Schon besser, aber auch unkomfortabel
o Entweder für jeden Benutzer eine eigene Datei, oder eine Datei für alle; auf jeden Fall schwierig zu erweitern - Die Daten werden in einer Datenbank gespeichert
o Einfache Verwaltung
o Flexibel
3 Aufbau der Tabelle
Theoretisch kann der Webmaster auswählen, ob er die Daten aller Benutzer in einer Tabelle haben will, oder für jeden Benutzer eine separate Tabelle anlegen will.
Praktisch ist es, die Daten aller Benutzer in
einer Tabelle zu speichern.
Dieses Vorgehen erleichtert eine spätere Anpassung der Datenstruktur, da so unabhängig von der Anzahl an Benutzern nur eine Tabelle modifiziert werden muss.
Die Tabelle benötigt auf jeden Fall die folgenden Felder:
- Name des Benutzers, mit dem er im System agieren will (vergleichbar dem Nickname in einem Forum wie dem WebStyleBoard)
Da der Name zur Authentifizierung genutzt wird, muss er eindeutig sein.
In mySQL wird das über UNIQUE erledigt. - Passwort des Benutzers
Weitere optionale Felder:
- Mail-Adresse des Benutzers
An diese Adresse kann z. B. ein neues Passwort geschickt werden oder es können Meldungen des Webmasters an diese Adresse gesendet werden
- Anzahl der fehlerhaften Loginversuche
- Ein Feld, dass anzeigt, ob der Benutzer gesperrt ist
- Ein Feld, dass anzeigt, ob der Benutzer seinen Account aktiviert hat
Dieses Feld kann z. B. auch dazu verwendet werden, die Echtheit der Mail-Adresse zu prüfen. - ...
Ein nicht essentielles Feld, das aber dennoch zu empfehlen ist, ist die ID des Users.
Diese ID ist eine eindeutige Zahl, anhand derer ein User ganz zweifelsfrei und unproblematisch identifiziert werden kann.
Ebenfalls empfehlenswert ist eine Spalte, in der die ID der Session des Benutzers steht.
Damit ergibt sich folgender Aufbau für die Benutzertabelle:
|
Quellcode
|
1
2
3
4
5
6
7
8
|
CREATE TABLE users
(
userid int(11) PRIMARY KEY auto_increment,
UserNick varchar(20) NOT NULL DEFAULT '',
UserPass varchar(32) NOT NULL DEFAULT '',
UserSession varchar(32),
UNIQUE KEY UserNick (UserNick)
)
|
4 Das Passwort
Das wird keine Abhandlung über das Generieren eines sicheren Passworts und es wird sich auch kein Hinweis darauf finden, Passphrasen wie
geheim,
007,
passwort, dem
Geburtstag des Kanarienvogels rückwärts zu verwenden (abgesehen von diesem Hinweis

)
Es ist aber immer eine gute Idee, die Passwörte nicht einfach so abzuspeichern, sondern verschlüsselt.
Zum Verschlüsseln bietet sich die mySQL-Funktion
MD5 an.
Wenn das Passwort verschlüsselt ist, muss natürlich auch das eingegebene Passwort verschlüsselt werden und dann mit dem verschlüsselten in der Tabelle gespeicherten Passwort verglichen werden.
5 Der Beispieluser
Zum Nachvollziehen und Testen des hier Geschrieben wird jetzt ein Benutzer angelegt:
|
Quellcode
|
1
2
3
|
INSERT INTO users
(UserNick, UserPass)
VALUES ('admin', MD5('pass'))
|
Jetzt ist ein Benutzer angelegt, dessen Logindaten folgendermaßen lauten:
- Name: admin
- Passwort: pass
6 Das Loginformular
Zum Einloggen wird natürlich ein Formular benötigt, in das der Benutzer in spe seine Daten eingeben kann:
|
Quellcode
|
1
2
3
4
5
6
7
|
<form method="POST" action="do_login.php">
<p>
Name: <input type="text" name="nick" /><br />
Passwort: <input type="password" name="pass" /><br />
<input type="submit" name="login" value="Alla hopp" />
</p>
</form>
|
7 Das Einloggen
In der Datei do_login.php müssen die Eingaben des Benutzers jetzt geprüft werden:
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?php
session_start() or die('Konnte Session nicht starten');
if (!isset($_POST['login']))
// Das Formular wurde nicht abgeschickt
die('Formular wurde nicht abgeschickt!');
//Zusammenbasteln des SQL-Statements
$SQL='SELECT userid
FROM users
WHERE UserNick='.$_POST['nick']." AND UserPass=MD5('".$_POST['pass']."'
LIMIT 1";
//Testweise ausgeben
echo '<pre>'.$sql.'</pre>';
//Verbinden mit der Datenbank
$connect=@mysql_connect('host', 'user', 'passwort') or die(mysql_error());
@mysql_select_db('Name der Datenbank, die die Tabelle beinhaltet', $connect) or die(mysql_error());
//SQL-Statement ausführen
$result=mysql_query($sql) or die(mysql_error());
//Datensatz in Array einlesen
$user=@mysql_fetch_assoc($result) or die(mysql_error());
if (!is_array($user))
//Kein Datensatz gefunden
die('Die Kombination aus '.$_POST['nick'].' Und '.$_POST['pass'].' ist nicht korrekt!');
//Zusammenbasteln des SQL-Statements
$SQL="UPDATE users
SET UserSession='".session_id()."'
WHERE userid=".$user['userid'];
//Einloggen
@mysql_query($sql) or die(mysql_error());
?>
|
8 Die Prüfung
Jetzt muss noch geprüft werden, ob der Mensch, der eine Seite aufruft auch eingeloggt is. Dazu ist folgender Code ist auf
jeder Seite einzubauen und zwar ganz am Anfang, vor jeglicher Ausgabe:
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
<?php
session_start() or die('Konnte Session nicht sarten');
include 'pfad/zur/check_login.php';
$user=logged_in();
if (!$user['logged_in'])
//Nicht eingeloggt
header('location: login.php');
echo 'Hallo '.$user['UserName'].'<p />Folgende Daten stehen zur Verfügung:<pre>';
print_r($user);
echo '</pre>Bitte beachten Sie, dass das Passwort, das Sie sehen, verschlüsselt angezeigt wird.';
?>
|
So, das war's, fehlt bloß noch die Funktion logged_in. Die Funktion wird in der Datei check_login.php gespeichert und hat folgenden Inhalt:
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php
function logged_in()
{
//Abfrage zusammenbasteln
$SQL="SELECT *
FROM users
WHERE UserSession='".session_id()."'";
//Testweise ausgeben
echo '<pre>'.$sql.'</pre>';
//Verbinden mit der Datenbank
$connect=@mysql_connect('host', 'user', 'passwort') or die(mysql_error());
@mysql_select_db('Name der Datenbank, die die Tabelle beinhaltet', $connect) or die(mysql_error());
//SQL-Statement ausführen
$result=mysql_query($sql) or die(mysql_error());
//Datensatz in Array einlesen
$user=@mysql_fetch_assoc($result) or die(mysql_error());
$user['logged_in']=(@mysql_num_rows($result)==1);
return $user;
}
?>
|
9 Das Ausloggen
Sollte ein angemeldeter Benutzer auf den wahnwitzigen Gedanken kommen, sich auszuloggen, muss zum einen die Session zerstört werden und zum anderen der Wert in der Spalte UserSession des benutzers entfernt werden
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
session_start() or die('Konnte Session nicht sarten');
include 'pfad/zur/check_login.php';
$user=logged_in();
if ($user['logged_in'])
{
//SQL-Anweisung zusammenbasteln
$SQL="UPDATE users
SET UserSession=NULL
WHERE UserSession='".session_id()."'";
//SQL-Befehl ausführen
@mysql_query($sql) or die(mysql_error());
//Session zerstören
session_destroy();
}
|
10 Der Schluss
Das waren die Grundzüge eines Logins, ich hoffe, es war sowohl verständlich als auch hilfreich.
Bei Kritik, Fragen, Lob und Anerkennung gilt: Immer her damit!
Bei Fragen nach der Implementierung der erwähnten optionalen Felder und den dazu nötigen Funktionen könnt ihr auch einfach ein paar Zeilen schreiben. Wenn ich Zeit habe, werde ich mich dransetzen.
Dann noch viel Spaß bei was auch immer ihr jetzt noch tun werdet
mr_happiness
[edit]
Bin ja ein richtiger Frühaufsteher, das war der erste Thread heute (14.06.2003)

[/edit]