PHP ist von den in den meisten Serversystemen implementierten 
    Sicherheitseinstellungen hinsichtlich der Berechtigungen auf Datei- 
    und Verzeichnisebene abhängig. Dies verleiht Ihnen Kontrolle darüber, 
    welche Dateien in dem Dateisystem gelesen werden dürfen. Vorsicht ist 
    bei weltweit lesbaren Dateien geboten um sicherzustellen, dass diese 
    sicher von allen Usern mit Zugriff auf dieses Dateisystem (nur) gelesen 
    werden können.
   
    Da PHP entwickelt wurde um Zugriffe auf das Dateisystem auf Benutzebene
    zu erlauben, ist es natürlich auch möglich ein PHP Skript zu schreiben
    das Ihnen erlaubt Systemdateien wie /etc/passwd zu lesen, 
    Ethernetverbindungen zu modifizieren, enorme Druckaufträge zu senden, 
    etc. Dies hat offensichtliche Implikationen, indem Sie sicherstellen 
    müssen, dass alle von Ihnen zu lesenden bzw. zu schreibenden Dateien 
    auch die richtigen sind.
   
    Stellen Sie sich folgendes Skript vor, in dem ein User zum Ausdruck 
    bringt, dass gerne eine Datei in seinem Heimatverzeichnis löschen 
    möchte. Dies geht von einer Situation aus, in der ein PHP Web-Interface
    regelmäßig zum Dateimanagement verwendet wird, und der Apache User 
    ist auch berechtigt, in seinem Heimatverzeichnis Dateien zu löschen.
   
    
Beispiel 15-1. Schlechte Variablenprüfung führt zu.... 
<?php // Löschen einer Datei aus dem Heimatverzeichnis des Users $username = $_POST['user_submitted_name']; $homedir = "/home/$username"; $file_to_delete = "$userfile"; unlink ("$homedir/$userfile"); echo "$file_to_delete wurde gelöscht!"; ?>
 |  
  | 
   Da der Benutzername über ein User-Formular zu posten ist, kann 
   jeder einen Benutzer- und Dateinamen von jemand anderen übertragen, 
   und Dateien löschen. In diesem Fall empfiehlt es sich, eine andere 
   Form der Authentifizierung zu verwenden. Stellen Sie sich vor was
   passieren würde, wenn die übertragenen Variablen "../etc/" und 
   "passwd" beinhalten würden. Der Code würde dann effektiv lesen:
    
Beispiel 15-2. ... Ein Angriff auf das Dateisystem 
<?php // löscht eine Datei irgendwo auf der Festplatte, wo der  // Benutzer die nötigen Rechte besitzt. Wenn PHP root hat: $username = "../etc/"; $homedir = "/home/../etc/"; $file_to_delete = "passwd"; unlink ("/home/../etc/passwd"); echo "/home/../etc/passwd wurde gelöscht!"; ?>
 |  
  | 
    Es gibt zwei wichtige Kriterien die Sie beachten sollten, um diese 
    Dinge zu vermeiden:
    
    Hier ist ein verbessertes Skript:
    
Beispiel 15-3. Etwas sicherere Prüfung des Dateinamens 
<?php // löscht eine Datei von der Festplatte, auf die // der PHP user Zugriff hat.  $username = $_SERVER['REMOTE_USER']; // verwendet eine                                       // Authentifizierungsmethode $homedir = "/home/$username";
  $file_to_delete = basename("$userfile"); // den Pfad entfernen unlink ($homedir/$file_to_delete);
  $fp = fopen("/home/logging/filedelete.log","+a"); //logge die Löschung $logstring = "$username $homedir $file_to_delete"; fputs ($fp, $logstring); fclose($fp);
  echo "$file_to_delete wurde gelöscht!"; ?>
 |  
  | 
    Auch dies nicht völlig makellos. Wenn Ihr Authentifizierungssystem
    Benutzern erlauben sollte, deren eigene Logins zu kreieren, und ein 
    Benutzer wählt den Login "../etc", ist das System wieder aufgedeckt.
    Aus diesem Grund ziehen Sie es vielleicht vor, einen besseren Check 
    zu schreiben:
    
Beispiel 15-4. Sicherere Dateinamensprüfung 
<?php $username = $HTTP_SERVER_VARS['REMOTE_USER']; // verwendet eine                                                // Authentifizierungsmethode $homedir = "/home/$username";
  if (!ereg('^[^./][^/]*$', $userfile))     die('bad filename'); // "DIE", gehen Sie nicht weiter
  if (!ereg('^[^./][^/]*$', $username))      die('bad username'); // "DIE", gehen Sie nicht weiter //etc... ?>
 |  
  | 
   
    Abhängig vom Betriebssystem gibt es eine große Anzahl Dateien mit der
    Sie sich befassen sollten, inklusive Einträge für Geräte (/dev/ oder 
    com1), Konfigurationsdateien (/etc/ Dateien und die .ini Dateien), gut
    bekannte Verzeichnisse (/home/, My Documents), etc. Aus diesem Grund
    ist es gewöhnlich einfacher eine Vorgangsweise einzuführen, bei der
    außer den von Ihnen explizit erlaubten Dingen alles verboten ist.