Ergebnis 1 bis 2 von 2
  1. #1
    CIH-Virus Avatar von Steiger_mp
    Registriert seit
    18.08.2007
    Beiträge
    485

    Standard Problem beim Auflisten von Dateien

    Ich möchte alle Dateien in einem Verzeichnis auflisten.Dieses Verzcihnis enthält nur php Dateien.

    Code:
    if($dir=opendir($path))
    {
     while($file=readdir($dir))
     {
      if (!is_dir($file) && $file != "." && $file != "..")
      {
       printf('<a href="index.php?p=showc&id=%s">%s</a>', $file, $file);
     
       echo "<br />";
     
      }
     }
    closedir($dir);
    }
    Die Dateien werden als links ausgegeben wobei der dateiname als Parameter dient.
    Um jedoch RFI Lücken zu vermeiden, möchte ich nicht,dass die ausgegebenen links eine Extension (in diesem Verzeichnis kommen nur .php Files vor)haben.Wie kann ich das nun bewerkstelligen?

    Ich google seit ner Stunde und finde nichts.
    Danke shconmal im voraus.
    Gerne würde ich dumme Antworten anderer User zitieren um mein Ego zu steigern. Nur leider passt das halbe Forum nicht in meine Signatur.

  2. #2
    Kevin Lee Poulsen Avatar von VeN0m
    Registriert seit
    30.12.2008
    Beiträge
    1.270

    Standard

    Also wenn Du machst

    Code:
    &id=%s.php
    Könnte man es ja durch den Nullbyte (%00) ausgrenzen und per ../ das Verzeichnis wechseln. Ich empfehle Regex oder eine strpos()-Lösung. Was ich nun nicht verstehe ist, warum Du mit !is_dir arbeitest statt mit is_file. Ich optimiere einfach mal drauflos.
    Erstmal per Regex:



    Wie man sieht prüfe ich per preg_match() und /php/, ob PHP im String vorkommt. Wenn nicht wird das gesamte Script per die() beendet und "Access Denied!" ausgegeben. Sofern jemand also versucht etwas anderes, als "php" zu übergeben oder dieses per Nullbyte auszugrenzen wird das Script beendet. Anders ginge es auch mit strpos, was ich jedoch nicht so elegant fände. Hierbei sähe es so aus:



    Strpos sucht nach dem ersten Vorkommen von "Suchmich" (Parameter zwei) in "Meinstring" (Parameter eins). Da hier sowohl "1" und "0" als auch "true" und "false" vorkommen können prüfen wir mit "===" (ganz genau typ- und wertgleich), ob "php" vorkommt. Wenn halt nicht wird wieder "access denied" per die() ausgegeben und das Script beendet.
    Ich habe jetzt mit is_file() gearbeitet, weil ich das etwas eleganter finde. Zudem habe ich Dein printf durch ein $res .= ersetzt, was die Variable $res dann immer wieder erweitert. Das heißt, dass erst wenn die Schleife zuende ist eine Ausgabe stattfindet und nicht schon vorher, was nochmal die Sicherheit verstärkt. Denn wenn die() aufgerufen wird kommt die Schleife niemals zu einem Ende, weil sie an dieser Stelle beendet wird (mit dem Script gleich mit). Kann der Ordner nicht geöffnet werden wird ein Fehler ausgegeben.

    Zum lesen: PHP-Manual: Strpos sowie PHP-Manual: Preg_Match, PHP-Manual: is_file und Wikipedia: Regulärer Ausdruck (Regex)

    Viel Spaß
    Geändert von VeN0m (17.05.2009 um 14:58 Uhr) Grund: Logische Reihenfolge bei true / false & 1 / 0
    Come to the dark side - We have cookies

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •