Felix Riesterer: Sicherheit...?

Beitrag lesen

Lieber Enrico,

der Wert in der Variablen $seite ist wohl einem URL-Parameter entnommen, oder?

$inhalt = dateiEinlesen ($seite);

Man sieht es hier noch nicht, aber spätestens in der Funktion selbst sollte das eventuelle Sicherheitsproblem klar werden:

<?php
function dateiEinlesen ($datei)
{
   clearstatcache();

   $datei = "txt/" . $datei . ".txt";

   if (!!@filemtime ($datei))
   {
      if (0 != filesize ($datei))
         return file_get_contents ($datei);
      else
         return 0;
   }
   else
      return -1;
}
?>

Du prüfst lediglich, ob die Datei eine Dateigröße ungleich null Bytes hat, nicht aber, ob die Datei auch wirklich in Deinen Verzeichnissen, bzw. in den beabsichtigten Verzeichnissen liegt. Du stellst lediglich ein "txt/" vor den Pfad und eine Dateiendung ".txt" hinten an.

Genügt das wirklich, um unberlaubte Dateipfade zu vermeiden? Möchtest Du zur Sicherheit nicht lieber alle Slashes aus dem Wert der Variablen $seite vorher entfernen?

$inhalt = dateiEinlesen ( str_replace ('/', '', $seite) );

Desweiteren gefällt mir die Prüfung auf Vorhandensein der Textdatei so noch nicht. Warum nutzt Du nicht die Funktion is_file() anstelle von filemtime? Das mag jetzt eher ein akademisches Problem sein, aber der Code liest sich später tatsächlich einfacher, wenn man anhand des Funktionsnamens schon sieht, was diese Prüfung hier soll.

Liebe Grüße,

Felix Riesterer.