Ich will den Artikel PHP/Anwendung und Praxis/Loginsystem um den Schutz anderer Dateien ergänzen.
Dazu will ich einen neuen Abschnitt einführen, der dann, neben einer Beschreibung folgendes enthält:
Ressource "sendFile.php"
<?php
require_once('auth.php');
if ( isset($_GET['file']) && $_GET['file']) {
$_GET['file'] = './' . $_GET['file'];
$forbidden=array('../', '/..', '/.ht');
$_GET['file']= str_replace($forbidden,'', $_GET['file']);
if ( is_file($_GET['file']) && is_readable($_GET['file']) ) {
if ( function_exists('finfo_open') ) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType=finfo_file($finfo, $_GET['file']);
} elseif ( function_exists('mime_content_type') ) {
$mimeType=mime_content_type($_GET['file']);
} else {
$mimeType="application/unknown";
}
header('Content-Type:'. $mimeType);
readfile($_GET['file']);
exit;
}
}
show_forbidden ();
exit;
Dazu die .htaccess:
# keine Prüfung, ob mod_rewrite geladen ist.
# Es ist besser, einen 500er Fehler zu haben als die Dateien
# unbemerkt ungeschützt auszuliefern
RewriteEngine On
#Zugriffe auf versteckte Dateien (deren Namen
# beginnen bei Unixoiden mit einem Punkt)
werden verboten
RewriteRule "^.*/\." - [F]
RewriteRule "^\." - [F]
#Directory Index (ggf. mit Parametern)
RewriteRule "^$" ./index.php [L]
RewriteRule "^?(.*$)" ./index.php?$1 [L]
#PHP-Dateien kontrollieren sich selbst
RewriteRule "^(.*\.php)$" - [L]
RewriteRule "^(.*\.php[?&].*)$" - [L]
#Ressourcen, die nicht durch sendFile.php kontrolliert werden
# z.B. Verzeichnis interior
RewriteRule "^interior/(.*)$" - [L]
#Alles andere liefert die Datei sendFile.php aus
RewriteRule "^(.*)$" ./sendFile.php?file=$1 [L]
* Frage: Habe ich was übersehen?
* Erster Diskussionspunkt:
show_forbidden sollte aus meiner Sicht nicht zwischen Error 404 (Datei gibt es nicht) und 403 (Zutritt verboten) unterscheiden, um kein Angriffsziel im Sinne des Untersuchens, ob eine zu schützende Datei vorhanden ist, zu bieten.
* Zweiter Diskussionspunkt:
Tja. Was machen wir mit anderen Ressourcen? z.B. könnten Perl bzw. CGI Skripte auch die Session auswerten oder aber - und das ist der Stand des obigen - deren Quelltext ausliefern.
Jörg Reinholz