Advanced SQL - Praxistutorial 1 - Login
1. Die Abschnitte
- Vorwort
- Die Datenbank-Klasse
- Verbindungsaufbau
- Login
- Die grundsätzliche Vorgehensweise
- Die Übersichtsliste
- Mitglied auf dem Marktplatz anzeigen
- Mitglied anbieten Teil 1
- Mitglied anbieten Teil 2
- Direktangebot machen Teil 1
- Direktangebot machen Teil 2
- Tauschangebot machen Teil 1
- Tauschangebot machen Teil 2
- Tauschangebot machen Teil 3
2. Die Login-"Klasse"
... verdient den Namen eigentlich nicht. Ich zeige euch aber drei Sachen, die ich bisher unterschlagen habe. Glaub ich zumindest. Die entsprechende Datei
ist natürlich die Login.class.php
im Ordner class
. Und die Zugangsdaten für die Gildenmeister findet ihr im Klartext in der
Datenbank.
Ein Tipp
Nehmt den Spieler super
mit dem Passwort Mario
. Auf den ist dieses Tutorial zugeschnitten und entsprechende Daten sind auch
schon vorhanden.
Der Aufbau
class Login {
public static function checkStatus($db) {
if ( !empty($_SERVER['PHP_AUTH_USER'])
&& !empty($_SERVER['PHP_AUTH_PW'])) {
$query = 'SELECT
id, gilde
FROM
mitglied
WHERE login = \''.$_SERVER['PHP_AUTH_USER'].'\'
AND pw = \''.$_SERVER['PHP_AUTH_PW'].'\'
AND status = 2';
$user = $db -> selectOne($query);
if (empty($user)) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Private Area');
}
else {
$_SESSION['login'] = $user['id'];
$_SESSION['gilde'] = $user['gilde'];
return true;
}
}
else {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Private Area');
}
}
}
Die Klasse enthält eine einzige statische Methode, zu der ich nicht viel erzählen muss. Die Grundlagen mit dem header
und dem 401
habe ich ja schon an dieser Stelle erläutert. Eine Sache blieb dabei unerwähnt und zu der komme ich jetzt.
3. Die Anmeldung
... erfolgt natürlich in der index.php
.
session_start();
if (empty($_SESSION['login'])) {
$login = Login::checkStatus($db);
if (true !== $login) {
exit();
}
}
Erläuterung
Wenn keine Session existiert, so wird die Methode checkStatus
der Klasse Login
aufgerufen. Und jetzt kommen wir zur
ersten Besonderheit. Das __autoload
greift auch dann, wenn man kein Objekt aus einer Klasse erzeugt, sondern auf eine statische Methode
zugreift (Hallo Achim, hab es endlich geschafft, den Hinweis unterzubringen).
Die zweite Besonderheit
Wenn man falsche Daten eingibt, so wird automatisch wieder ein 401
gesendet. Allerdings hängt das vom Browser ab. Beim Firefox oder Safari
plöppt das Anmeldefenster immer und immer wieder auf. Beim Internet Explorer dagegen ist nach drei Fehlversuchen Schluss mit lustig. Dann will der nicht mehr.
Und mein aktueller Opera (11.50) kommt mit einer blöden Google-Suche an, weil er das nicht unterstützen will. Ihr seht also schon, dass diese Form des Logins
äußerst problematisch ist.
Die dritte Besonderheit
Im Anmeldefenster gibt es einen "Abbrechen"-Button, mit dem man die Prozedur abbricht. Kommentiert mal das exit()
aus und benutzt im Firefox
oder dem Internet Explorer besagte Schaltfläche. Dann bekommt ihr tatsächlich die eigentliche Seite zu Gesicht! Beim IE tritt dasselbe Verhalten auf, wenn
man drei Mal falsche Daten eingibt, denn möglicherweise entspricht das einem Abbrechen. Im Safari dagegen wird euch der Zutritt zur Seite verweigert, wenn
irgendwas nicht stimmt. Also niemals das exit()
vergessen, wenn ihr mit dieser Technik arbeitet.
4. Das Sicherheitsniveau
... ist praktisch nicht existent. Die Passwörter sind im Klartext vorhanden und es gibt keine Prüfung auf Groß- oder Kleinschreibung. Also nehmt euch das hier um Gottes Willen nicht zum Vorbild!
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt