muffez: php include - Pfadangabe?

Wie gebe ich in unten stehendem Code eine Pfadangabe zum Ordner (z.B. /ordner/html/) in dem die zu includenden Dateien sind korrekt an?

<?php include($_GET['datei'].".html"); ?>

Danke!

  1. versuch doch mal mit "/ordner/html/".$_GET['datei'].".html" :)

    1. versuch doch mal mit "/ordner/html/".$_GET['datei'].".html" :)

      eben das funktioniert komischerweise nicht...

      1. versuch doch mal mit "/ordner/html/".$_GET['datei'].".html" :)

        eben das funktioniert komischerweise nicht...

        dann versuchs mal mit folgendem:
        include "../ordner/html/".$_GET['datei'].".html";
                  ^-- musst du halt noch anpassen, je nach dem, wo dein Script und die Datei auf die du zugreifen willst liegt...

        hoffe, ich konnte helfen,
        Philip

  2. Moin!

    Wie gebe ich in unten stehendem Code eine Pfadangabe zum Ordner (z.B. /ordner/html/) in dem die zu includenden Dateien sind korrekt an?

    <?php include($_GET['datei'].".html"); ?>

    Oha, eine böse Falle droht. Ich hoffe, du hast $_GET['datei'] vor diesem Befehl schon auf mögliche illegale Werte geprüft, denn ansonsten öffnest du eine Breitseite für Angreifer, die ihren eigenen Code integrieren können.

    Stell dir nur mal vor, was passiert, wenn in $_GET['datei'] folgendes drinsteht:
    "http://fremder.server.example.com/angriffsordner/zerstoerskript"

    Und das zerstoerskript.html wird dann vom anderen Server geladen, enthält PHP-Quellcode und arbeitet auf _deinem_ Server irgendwas, was du nicht weißt.

    Deshalb: _Niemals_ include ungefiltert mit Userdaten füttern. Wenn du nicht darauf angewiesen bist, dass die Datei wirklich von PHP _interpretiert_ werden muß, sondern sie nur reines HTML enthält, dann gibts gute, ungefährliche Alternativen:
    http://www.php.net/manual/de/function.readfile.php zum Beispiel.

    - Sven Rautenberg

    --
    Signatur oder nicht Signatur - das ist hier die Frage!
    1. reicht da sowas in der Art aus?:

      if ($datei=="legalerwert"){
      include(...);
      }

      Irgendwie merke ich gerade, wie wenig Ahnung ich habe ;).

      1. Moin!

        reicht da sowas in der Art aus?:

        if ($datei=="legalerwert"){
        include(...);
        }

        Ja, _das_ ist _so_ vollkommen ok.

        Was wirklich ideal ist: In der URL werden nur IDs oder Schlüsselworte übergeben, und intern hast du eine Tabelle, in der diese IDs oder Schlüsselworte in einzubindende Dateinamen übersetzt werden.

        $einbinden = array(
                     'index' => 'index.html',
                     'impressum' => 'kontakt.html',
                     'thema1' => 'thema1/index.html'
                     )

        Das definiert, welche Schlüsselworte existieren, und welche Dateien aufgrund dessen eingebunden werden können.

        Wenn du das Schlüsselwort in $_GET['datei'] übergibst (also z.B. 'seite.php?datei=impressum'), dann kannst du die Übersetzung in eine reale Datei simpel erledigen:

        readfile( $einbinden[ $_GET['datei'] ] );
        (wahlweise geht natürlich auch include() an dieser Stelle)

        Die Vorteile: Das Array $einbinden hat immer definierte Werte, die man nicht durch Benutzereingaben überschreiben bzw. ergänzen kann.

        Und wenn undefinierte Werte für den Parameter 'datei' angegeben werden, wird nichts eingebunden. Ok, dabei entsteht möglicherweise noch eine Fehlermeldung, die man abfangen könnte:

        if ($einbinden[$_GET['datei']] != "")
        {
          readfile(einbinden[$_GET['datei']]);
        }
        else
        {
          // Irgendwas ist hier falsch - aber nicht zwingend ein Angreifer am Werk
        }

        Du mußt halt irgendeine Prüfung einbauen, oder wissen bzw. abschätzen können, welche Konsequenzen bei falschen bzw. manipulierten Daten drohen.

        Mit readfile hast du nichts zu befürchten, die angegebene Datei wird eingelesen und an der Stelle des readfile-Kommandos wieder ausgegeben. Es ist ziemlich egal, ob das nun eine interne Datei von dir ist, oder irgendeine extere URL. Bedingung wäre bei deinem ursprünglichen Namenskonstrukt ja, dass sie auf ".html" endet - also ist ausgeschlossen, dass z.B. PHP-Dateien auf diese Weise eingebunden werden. Aber diese Sicherheit existiert eben nur aufgrund des festen, unabänderlichen Namenszusatzes ".html", nicht einfach nur aufgrund des readfile-Kommandos.

        Irgendwie merke ich gerade, wie wenig Ahnung ich habe ;).

        Soviel Ahnung hatte ich auch mal. Aber man lernt ständig dazu. :)

        - Sven Rautenberg

        --
        Signatur oder nicht Signatur - das ist hier die Frage!