HowTo: PHP-Login-Oberfläche
© 2002 by Dennis Neuhäuser


Will man das äußerst effektive und sichere Passwortschutzverfahren mittels .htaccess Datei (auf einem Apache-Server) mit einer ansprechenden Login-Oberfläche (anstatt dem Standard-Browser-Popup) verbinden, steht man vor einem Problem.

Es gibt zwar verschiedene andere Möglichkeiten bestimmte Seiten mit Passwort zu schützen, dabei ist aber nicht immer gewährleistet, dass die Seite bei späterem direktem Aufruf nicht für jedermann zu erreichen ist. Außerdem ist das Schützen ganzer Verzeichnisse so kaum zu realisieren, was mit entsprechenden .htaccess Dateien recht einfach gelingt.

Das bekannte Popup beim Schutz über .htaccess wird vom jedem Standard-Browser geöffnet, wenn er vom Server den Code 401 (Authorization required) erhält. Im Normalfall öffnet sich dieses Popup bis zu 3 mal, wenn keine korrekte Authorisierung vorliegt. Erst nach der dritten Falscheingabe gibt der Browser eine entsprechende Fehlermeldung des Servers aus.

Ein erster Versuch mittels eines JavaScripts (findet übrigens auch im endgültigen Skript teilweise noch Verwendung), das die Login-Daten (Benutzername und Passwort) aus einem Formular ausliest und eine entsprechende URL zum Aufruf der geschützten Seite generiert, hat spätestens dann einen großen Nachteil, wenn ein ungültiger Benutzername bzw. ein falsches Passwort eingegeben wird. In diesem Fall öffnet der Browser nämlich wieder ein Popup-Fenster zur Eingabe der korrekten Daten, was ja gerade vermieden werden sollte.

Es muß also ein Weg her, der er ermöglicht, das eingegebene Passwort zu überprüfen, bevor der Browser die geschützte Seite aufruft und das Popup generiert. PHP bietet hier eine geniale aber doch recht simple Lösung:
Es werden Benutzername und Passwort aus einem Formular ausgelesen und mit diesen eine seperate Verbindung zum Server hergestellt. Der Server "ruft" sich also quasi selbst an.
Wenn die Authorisierung nicht erfolgreich war, gibt der Server den Code 401 zurück, der vom PHP-Skript ausgewertet wird und es erscheint sofort eine entsprechende Fehlermeldung. Bei erfolgreicher Authorisierung (Code 200) wird ein JavaScript (s.o.) aufgerufen, das den Browser zur geschützten URL (inkl. Anmeldedaten) weiterleitet.
Hierbei entsteht noch das Problem, das nach Weiterleitung auf die geschützte Seite (und bei weiterer Verlinkung auf Unterseiten) Benutzername und Passwort in der Adresszeile des Browsers im Klartext sichtbar sind. Dies kann aber ganz einfach durch eine META-Tag-Weiterleitung gelöst werden, da der Browser die Anmeldedaten nach einmaliger erfolgreicher Anmeldung im Cache hat.

Das Skript ermöglicht es auch, jedem Benutzer ein eigenes geschütztes Verzeichnis zuzuweisen.

benötigte Dateien: Download v1.0 (27.01.2002)        
  • /htdocs/login/index.php
  • baut das Frameset für die Login-Oberfläche auf
  • /htdocs/login/main.php
  • Hauptdatei, Login-Skript
  • /htdocs/login/secret/.htaccess
  • Beispieldatei für den Passwortschutz des Verzeichnisses
  • /htdocs/login/secret/zugang.htm
  • Zugangsdatei im geschützten Verzeichnis, leitet zur index.htm weiter
  • /htdocs/login/secret/index.htm
  • Inhalt der geschützten Seite (selbst zu erstellen)
  • /hidden/.htpasswd
  • Passwortdatei (selbst zu erstellen, z.B. hier)


    Nachdem das ZIP heruntergeladen und entpackt wurde, muß zuerst die Datei main.php angepaßt werden. Dies geschieht recht einfach mittels der 4 Variablen am Anfang der Datei:

    $caption ist die Überschrift, die über der Login-Maske erscheint. Formatierungen mit <FONT>-Tags o.ä. sind möglich.
    $host ist der Domainname des Servers, auf dem das Skript ausgeführt wird (z. B. www.domain.de oder subdomain.domain.de). Wichtig: ohne http:// !
    $port ist der Port, auf dem der Server läuft und braucht im allgemeinen nicht geändert werden (Standard: 80).
    $dir

    gibt das geschützte Verzeichnis an. Standardmäßig erwartet das Skript eine Datei zugang.htm im Verzeichnis mit dem Namen des Benutzers. Das Verzeichnis muß vom www-root aus angegeben werden (also mit / anfangen), je nach Verzeichnisstruktur muß also u.U. noch ein Pfad vor den vorgegebenen gesetzt werden. Wenn für alle Benutzer dasselbe Verzeichnis gelten soll ersetzt man einfach $username durch das gewünschte Verzeichnis.

    $log = 1: Es wird eine Log-Datei über erfolgreiche und mißlungene Anmeldungen geführt (Die Datei wird beim ersten Login automatisch erstellt. Das Verzeichnis muß dazu über public-Schreibrechte verfügen).
    = 0: kein Log.
    $logfile ist der Dateiname der Log-Datei ausgehend vom Verzeichnis des Skripts.

    In der Datei index.php kann noch der <TITLE>-Tag beliebig angepaßt werden.

    In einem zentralen Verzeichnis (wenn möglich am Besten oberhalb des vom Internet aus zu erreichenden Root-Verzeichnisses, z.B. /hidden) die Datei .htpasswd mit den erstellten Benutzername-Passwort-Kombinationen ablegen.

    Nun die Dateien index.php und main.php in ein beliebiges Verzeichnis (z. B. einer Subdomain) kopieren. Unterhalb dieses Verzeichnisses beliebig viele Unterverzeichnisse mit den Namen der gewünschten Benutzer erstellen. (Tipp: Beim ersten Einrichten erstmal mit nur einem testen!)
    In diesen Unterverzeichnissen je eine index.htm mit dem jeweiligen Inhalt für den Benutzer erstellen.

    Weiterhin je eine angepaßte zugang.htm und eine .htaccess in diese Unterverzeichnisse kopieren.
    In der zugang.htm muß nur jeweils die vollständige Zieladresse inkl. Domain und Pfad, in welchem die Datei liegt im <META>-Tag angepaßt werden.
    In der .htaccess für alle Benutzer die Zeile AuthUserFile anpassen (damit sie auf die Passwortdatei zeigt) und jeweils AuthName und require user bzgl. des Benutzernamens anpassen.

    ...alles hochladen und das war's...
    Viel Spaß!


         



    Zuletzt aktualisiert am Montag, 03. November 2008 um 20:19 Uhr

    Design, HTML & Grafiken
    © Copyright 2000 - 2007
    by Dennis Neuhäuser
    All rights reserved.


    Das Kopieren jeglicher Komponenten dieser Seite ohne meine Zustimmung ist ausdrücklich nicht gestattet!
    Für den Inhalt der Werbung und der damit verlinkten Seiten kann ich keine Verantwortung übernehmen.