:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte
Unternehmen im
Anbieterverzeichnis von SELFPHP
:: SELFPHP Forum ::
Fragen rund um die Themen PHP? In über
120.000 Beiträgen finden Sie sicher die passende
Antwort!
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
:: Qozido ::
Die Bilderverwaltung mit Logbuch für
Taucher und Schnorchler.
|
|
Übermittelte Dateinamen überprüfen |
Systemvoraussetzung
- Linux
- Windows
- PHP 3 >= 3.0.9
- PHP 4
- PHP 5
- PCREBibliothek
Datei(en)
file_check.php
Problem
Sie bieten Dateien zum Download an, und die Dateinamen werden dabei per
GET oder POST übermittelt. Anschließend rufen Sie diese Datei auf und bieten
dann dem Besucher die gerade geholte Datei zum Download an.
Dieses Szenario sieht man sehr oft im Internet. Sie sollten sich aber immer
eines vor Augen führen: Variablen, die von außerhalb des eigenen Programmcodes
kommen, sind in erster Linie als „Feinde“ anzusehen. Wir sollten diesen
Variablen also niemals einfach trauen, sondern sie immer überprüfen.
Somit wäre es unter Umständen möglich, mit folgendem Variableninhalt die
Passwortdatei des eigenen Servers auszuliefern. Was das bedeuten kann, werden
Sie sich sicherlich vorstellen können. Deshalb trauen Sie keiner Variablen,
die von außen kommt!
Wir müssen sämtliche Variablen, die von außerhalb kommen und uns Schaden
zufügen könnten, überprüfen. Dafür nutzen wir in unserem Beispiel
preg_match() (29, 34). Wenn Sie Dateien zum Download anbieten und diese per
PHP ausliefern, lassen Sie sich lediglich den reinen Dateinamen übermitteln
und setzen den Verzeichnisnamen fest in der PHPDatei
ein.
Wir müssen dann nur noch die Variable daraufhin überprüfen, ob sie ein oder
mehrere Slashes beinhaltet. Ist das der Fall, brechen wir mit einer Fehlermeldung
ab (30, 35), ansonsten können wir die Datei ausliefern (32, 37).
In unserem Beispiel haben wir zwei Arrays zur Anschauung genutzt. Sie sollten
die Arrays später durch Ihre POST- oder
GET-Variablen
ersetzen.
26:
27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| $test[0] = "../../../../etc/passwd";
$test[1] = "wert.txt";
if(preg_match('=/=', $test[0])) echo 'Fehler! ' . $test[0] . ' ist nicht erlaubt.<br>'; else echo 'Datei ' . $test[0] . ' ist in Ordnung.<br>';
if(preg_match('=/=', $test[1]))
echo 'Fehler! ' . $test[1] . ' ist nicht erlaubt.<br>'; else echo 'Datei ' . $test[1] . ' ist in Ordnung.<br>';
| Beispiel 4.4: file_check.php
Ausgabe im Browser
Fehler! ../../../../etc/passwd ist nicht erlaubt. Datei wert.txt ist in Ordnung. |
Sie sehen nachfolgend die geänderte Version für die Übermittlung von GET-Variablen.
Sie müssen lediglich den Variablennamen anpassen.
1: 2: 3: 4: 5: 6: 7:
|
<?PHP $_GET['filename']; if(preg_match('=/=', $_GET['filename'])) echo 'Fehler! ' . $_GET['filename'] . ' ist nicht erlaubt.<br>'; else // Download starten ?>
|
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.
|
|
|
|
|
|