Hauptmenü

Untermenü

Advanced SQL - Praxistutorial 1 - Login

1. Die Abschnitte

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