Teil von  SELFPHP
Letztes Update: 24.07.2006 21:44:47 


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  

 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 79.000 Beiträgen finden Sie sicher die passende Antwort!  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 



 

Ü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!

../../../../etc/passwd

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
?>



 

 




 sponsored by

Host Europe


HighText iBusiness


Host Europe




© 2001-2006 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt