Systemvoraussetzung
- Linux
- Windows
- PHP 3
- PHP 4
- PHP 5
Datei(en)
crypt.php
Problem
Sicherlich kennen Sie das kleine, aber immer wiederkehrende Problem: Sie
wollen einfach auf die Schnelle ein komplettes Verzeichnis mit einer .htaccess-Datei
schützen. Die meisten Webhoster bieten in Ihren Konfigurationsmenüs
oftmals eine Möglichkeit, bestimmte Verzeichnisse zu schützen.
Nehme ich mich aber selbst als Beispiel, stelle ich fest, dass ich meist keine Lust
habe, mich erst einmal in das System meines Providers einzuloggen, diesen
Service aufzurufen und zum Schluss durch eine Menge an Verzeichnissen zu
wandern, bis ich endlich das Erstellen eines Passworts erledigt habe. Es mag
zwar keine Stunden dauern, aber zehn bis fünfzehn Minuten nimmt die Aktion
schon in Anspruch.
Wirklich toll wäre es, einfach eine PHP-Datei
mit FTP auf den Server zu legen,
diese dann im Browser aufzurufen und den Verzeichnisschutz in vollem
Umfang fertig eingerichtet vorzufinden.
Lösung
Die Lösung hierfür ist sehr einfach und erfordert noch nicht einmal viel
Aufwand. Den Programmierer des Programms kostete es zwar etwas Zeit, Sie
als Leser dieses Buches dürfen sich über das fertige Skript im beiliegenden ZIP-Archiv
freuen.
Wie benutzen für die Realisierung die PHP-Funktion
crypt(). crypt() ist eine
Einweg-String-Verschlüsselung
(Hashbildung) und liefert uns ein Passwort auf
Grundlage von DES, das nur mit sehr großem technischem Aufwand wieder
entschlüsselt werden kann. Allerdings wird dabei das Passwort nicht wirklich
entschlüsselt, sondern mit einer Brute-Force-Attacke
geknackt.
Brute-Force-Attacken
sind Versuche eines Programms, dass verschlüsselte
Passwort zu knacken, indem alle möglichen Kombinationen von Buchstaben,
Sonderzeichen und Zahlen ausprobiert werden.
Sie sollten daher niemals Passwörter verwenden, die zu kurz sind oder nur
aus Kleinbuchstaben etc. bestehen. Auch sind Passwörter wie z. B. Namen,
Vornamen, Tiernamen etc. nicht sicher, da es Wörterbücher für Brute-Force-Attacken
gibt.
Sie sollten immer Passwörter nutzen, die keinen Sinn ergeben und nur schwer
zu knacken sind, also aus mehr als nur sechs Zeichen bestehen. Dieses nur am
Rande, denn das Thema Passwörter und Brute-Force-Attacken
in seiner ganzen
Bandbreite würde ein ganzes Buch füllen.
function make_htaccess($user, $authName, $passwdFile ="")
@param string $user
@param string $authName
@param string $passwdFile
@return void
Die Function make_htaccess() erwartet als Parameter den Benutzernamen
($user), den Logintext ($authName), sobald das Loginfenster sichtbar wird,
und als optionalen Parameter den kompletten Pfad ($passwdFile) zu Ihrer
Datei .htpasswd (ohne abschließenden Slash).
Zuerst findet eine Überprüfung (40) statt, ob Sie ein Verzeichnis zu der Datei
.htpasswd angegeben haben. Sollte die Variable leer sein, wird die Datei in dem
Verzeichnis erstellt, in dem auch der Verzeichnisschutz gilt (und in dem auch
die Datei crypt.php liegt).
Bei einer leeren Variable wird nunmehr das aktuelle Arbeitsverzeichnis (41) in
die Variable gespeichert. Im nächsten Schritt wird der Inhalt der Datei .htaccess
aufgebaut (43-46)
und mit den Werten (Benutzername, Logintext und Pfad zur
.htpasswd) der einzelnen Variablen gefüllt.
Im aktuellen Arbeitsverzeichnis, also dort, wo auch der Verzeichnisschutz
erstellt werden soll, wird die Datei .htaccess erstellt (48-50).
Sollte nun ein
Benutzer dieses Verzeichnis lesen wollen, wird Ihr Webserver zuerst die Datei
.htaccess einlesen und feststellen, dass dieses Verzeichnis geschützt ist.
Der Webserver wird daraufhin ein Loginfenster öffnen und nach Benutzernamen
und Passwort fragen. Die durch den Benutzer eingegebenen Daten
wird der Webserver mit den Daten in der Datei .htpasswd vergleichen und bei
erfolgreichen Logindaten das Verzeichnis freigeben.
038: 039: 040: 041: 042: 043: 044: 045: 046: 047: 048: 049: 050: 051: 052: |
function make_htaccess($user, $authName, $passwdFile="")
{
if(empty($passwdFile)) $passwdFile=dirname(__FILE__); $access .= 'AuthType Basic' . "\n"; $access .= 'AuthName "' . $authName . '"' . "\n"; $access .= 'AuthUserFile ' . $passwdFile . '/.htpasswd' . "\n"; $access .= 'require user ' . $user . "\n"; $handle = fopen(".htaccess","w"); fputs($handle,$access); fclose($handle);
}
|
Beispiel 12.1: crypt.php
function make_htpasswd($user, $passwd, $passwdFile ="")
@param string $user
@param string $passwd
@param string $passwdFile
@return void
Die Function make_htpasswd() erwartet als Parameter den Benutzernamen
($user), das Passwort ($passwd) und als optionalen Parameter den kompletten
Pfad ($passwdFile) zu Ihrer Datei .htpasswd (ohne abschließenden Slash).
Zuerst findet eine Überprüfung (68) statt, ob Sie ein Verzeichnis zu der Datei
.htpasswd angegegeben haben. Sollte die Variable leer sein, so wird die Datei
in dem Verzeichnis erstellt, in dem auch der Verzeichnisschutz gilt (und in
dem auch die Datei crypt.php liegt). Bei einer leeren Variable wird nunmehr
das aktuelle Arbeitsverzeichnis (69) in die Variable gespeichert.
Im nächsten Schritt wird das im Klartext übergebene Passwort mit crypt()
verschlüsselt. Dieses erzeugte und verschlüsselte Passwort ist nicht mehr
entschlüsselbar und kann nur mit sehr hohem technischem Aufwand herausgefunden
werden. Der Benutzername und das verschlüsselte Passwort werden
mit einem Doppelpunkt voneinander getrennt in eine Variable (72) gespeichert,
damit dies im letzten Schritt in der Datei gespeichert (74-76)
werden kann.
Zur Speicherung benutzen wir den Parameter „a“, der unsere Kombination
aus Benutzernamen und Passwort in einer Datei anhängt. Sie möchten sicherlich
nur eine .htpasswd verwalten, aber verschiedene Verzeichnisse schützen.
Durch diesen Parameter ist dies möglich, da existierende Passwörter in der
Datei .htpasswd bestehen bleiben.
066: 067: 068: 069: 070: 071: 072: 073: 074: 075: 076: 077: 078: |
function make_htpasswd($user, $passwd, $passwdFile="")
{
if(empty($passwdFile)) $passwdFile=dirname(__FILE__); $passwd = crypt($passwd); $htpasswd = $user . ':' . $passwd . "\n"; $handle = fopen($passwdFile . '/.htpasswd',"a"); fputs($handle,$htpasswd); fclose($handle); } |
Beispiel 12.2: crypt.php
Bevor Sie beide Funktionen aufrufen, müssen Sie lediglich einen Konfigurationsparameter
wie z. B. Benutzername, Passwort, Logintext und den Pfad zur
Datei .htpasswd setzen. Falls Sie bereits eine bestehende Passwortdatei auf
Ihrem Server haben, so müssen Sie lediglich die Funktion make_htaccess()
(92) aufrufen und auf Ihre bestehende Passwortdatei verlinken.
080: 081: 082: 083: 084: 085: 086: 087: 088: 089: 090: 091: 092: 093: 094: 095: | // Den Benutzernamen für den Login
$user = 'Damir';
// Das Passwort für den Login $passwd = 'meinPasswort';
// Der Text, der angezeigt wird wenn das Login-Fenster geöffnet wird. $authName = 'Meine geschütztes Verzeichnis';
//Den kompletten Pfad zu der Datei .htpasswd, ohne abschließenden Slash (/) $passwdFile = '';
make_htaccess($user, $authName, $passwdFile);
make_htpasswd($user, $passwd, $passwdFile);
// unlink("crypt.php");
|
Beispiel 12.3: crypt.php
Inhalt der Datei .htaccess
AuthType Basic
AuthName "Mein geschütztes Verzeichnis"
AuthUserFile /homepages/16/d147850360/htdocs/verz/.htpasswd
require user Damir |
Inhalt der Datei .htpasswd
Damir:$1$abqjYKHv$sUIR4CbV4zRG27oENNvbX1 |
Wie Sie sehen, war die Lösung relativ simpel. Das Programm könnte aber
natürlich weiter ausgebaut werden. Z. B. könnten Sie am Schluss der Datei noch
folgenden Befehl ausführen:
Die Datei würde sich dann, nachdem der Verzeichnisschutz erstellt wurde,
selbst löschen. Dies hätte den Vorteil, dass Sie das nicht noch per FTP erledigen
müssten.
Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!
Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.
|