johannes: ist include unsicher?

hallo.
Ich möchte, bei meiner seite, das menü per include einbinden.
Jetzt habe ich irgendwo gelesen, dass man zusätzliche vorkehrungen
treffen muss, um zu überprüfen, ob die codezeilen eingebunden werden
dürfen, da sonst alles unsicher ist.
genaueres weiß ich nicht, deshalb frag' ich lieber mal nach.

g johannes

  1. Tach.

    Ich möchte, bei meiner seite, das menü per include einbinden.

    Enthält diese "Menüdatei" denn selber PHP-Code oder handelt es sich um reines HTML? Falls letzteres zutrifft, solltest du lieber readfile() statt include() benutzen.

    Jetzt habe ich irgendwo gelesen, dass man zusätzliche vorkehrungen
    treffen muss, um zu überprüfen, ob die codezeilen eingebunden werden
    dürfen, da sonst alles unsicher ist.
    genaueres weiß ich nicht, deshalb frag' ich lieber mal nach.

    Falls der Seitenbesucher von außen Einfluß darauf nehmen soll, welche Datei eingebunden wird, ist eine Überprüfung der entsprechenden Usereingaben in der Tat wichtig. Hast du so etwas vor oder möchtest du einfach immer nur unverändert die "Menüdatei" einbinden?

    --
    Once is a mistake, twice is jazz.
    1. Tach.

      Ich möchte, bei meiner seite, das menü per include einbinden.

      Enthält diese "Menüdatei" denn selber PHP-Code oder handelt es sich um reines HTML? Falls letzteres zutrifft, solltest du lieber readfile() statt include() benutzen.

      aha

      Jetzt habe ich irgendwo gelesen, dass man zusätzliche vorkehrungen
      treffen muss, um zu überprüfen, ob die codezeilen eingebunden werden
      dürfen, da sonst alles unsicher ist.
      genaueres weiß ich nicht, deshalb frag' ich lieber mal nach.

      Falls der Seitenbesucher von außen Einfluß darauf nehmen soll, welche Datei eingebunden wird, ist eine Überprüfung der entsprechenden Usereingaben in der Tat wichtig. Hast du so etwas vor oder möchtest du einfach immer nur unverändert die "Menüdatei" einbinden?

      nein, immer die gleiche.
      g johannes

  2. Lieber johannes,

    wenn Du den Pfad zum zu inkludierenden Script variabel hälst, dann musst Du sicherstellen, dass in der entsprechenden Variable auch nur das stehen kann, was Du auch dafür vorgesehen hast.

    // Sicher, weil fest vorgegeben:  
    $script = 'scripts/mein_script.php';  
    include ($script);  
      
    // grob fahrlässig:  
    $script = $_GET['include_pfad'];  
    include ($script);  
      
    // so geht es schon eher:  
    $erlaubte_scripts = array(  
        'scripts/navi.php',  
        'fehler.php',  
        'gaestebuch/gb.php'  
    );  
    $script = false;  
    if (in_array($_GET['include_pfad'], $erlaubte_scripts)  
        include ($_GET['include_pfad']);  
      
    // das ist auch sicher:  
    $scripte = array(  
        '1' => 'scripts/navi.php',  
        '2' => 'fehler.php',  
        '3' => 'gaestebuch/gb.php'  
    );  
    if (array_key_exists($_GET['include_pfad'], $scripte))  
        include($scripte[$_GET['include_pfad']]);
    

    Hoffentlich ist das alles jetzt auch in Ordnung so...

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Ich grüsse den Cosmos,

      Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?

      include('/pfad/zum/script/' . $_GET['file'] . '.php');

      Ich nutze dieses System und hab noch keine Möglichkeit gefunden, irgendwie fremde Seite einzuschleusen. Falls ich was übersehen hab, lerne ich aber gerne dazu ;)

      Möge das "Self" mit euch sein

      --
      Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
      ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
      1. Hallo Manuel,

        Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?

        include('/pfad/zum/script/' . $_GET['file'] . '.php');

        Nein. Was ist wenn $_GET['file'] ../../foo ist?

        Grüße
        Jasmin

        1. Hallo

          Hallo Manuel,

          Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?

          include('/pfad/zum/script/' . $_GET['file'] . '.php');
          Nein. Was ist wenn $_GET['file'] ../../foo ist?

          Dann wird es dies (höchstwahrscheinlich) nicht geben. /pfad/zum/script/../../foo ist ja schon ein ungewöhnlicher Pfadaufbau. :-)

          Eine vorhergehende Prüfung auf Plausibilität sollte schon sein. Wenn wir aber schon dort sind, kann man auch gleich Felix' System der Überprüfung auf Existenz verwenden.

          Tschö, Auge

          --
          Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
          (Victor Hugo)
          Veranstaltungsdatenbank Vdb 0.1
          1. Alles klar...

            thx, g, Johannes

        2. Ich grüsse den Cosmos,

          include('/pfad/zum/script/' . $_GET['file'] . '.php');
          Nein. Was ist wenn $_GET['file'] ../../foo ist?

          Das stimmt. Ich wusste doch, ich hab was übersehen ;)
          Dann werd ich wohl aus $_GET['file'] alles rausschneiden, was nach Pfad aussieht. Im Prinzip also

          ereg_replace('^.*/', '', $_GET['file'])

          Dann dürfte es unmöglich sein, dieses System zu infiltrieren. Oder hab ich noch was übersehen?

          Möge das "Self" mit euch sein

          --
          Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
          ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
        3. Hallo Manuel,

          Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?

          include('/pfad/zum/script/' . $_GET['file'] . '.php');
          Nein. Was ist wenn $_GET['file'] ../../foo ist?

          Nachtrag: Dieser Trick funktioniert nicht, wenn man einen Ordner als Alias in Apache angibt, also als eine Art "Pseudoordner". Eine andere Möglichkeit wäre ein Subdomain, z.B. http://include.example.com/.

          Grüße
          Jasmin

  3. Noch Etwas:
    Ich will eine datei includen, deren name in $toinclude gespeichert ist...
    wie stell ich das an?
    bei
    include "$einevariable";
    erhalte ich :

      
    Warning: main() [function.include]: Failed opening '' for inclusion (include_path='.:') in /usr/export/www/vhosts/funnetwork/hosting/johannesswo/mamaphp/make.php on line 84  
    
    

    siehe auch http://johannesswo.jo.funpic.de/mamaphp/home.php

    g johannes

    1. Lieber johannes,

      Ich will eine datei includen, deren name in $toinclude gespeichert ist...
      wie stell ich das an?

      der Inhalt von $toinclude muss ein String sein. Dieser String referenziert eine Datei entweder absolut (vom Betriebssystem aus gesehen, unter dem PHP läuft!), oder relativ (wie z.B. '../verz/datei.php'). Deine Fehlermeldung legt nahe, dass der Pfad im String von $toinclude zu einer nicht vorhandenen Datei weist!

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      --
      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      1. Lieber johannes,

        Ich will eine datei includen, deren name in $toinclude gespeichert ist...
        wie stell ich das an?

        der Inhalt von $toinclude muss ein String sein.

        ist er:
        var_dump($tooinclude); sagt: string(16) "home_content.php"

        Dieser String referenziert eine Datei entweder absolut (vom Betriebssystem aus gesehen, unter dem PHP läuft!), oder relativ (wie z.B. '../verz/datei.php').

        Die datei liegt im selben Ordner wie die includierende datei, genau wie der String auch nur den dateinamen "home_content.php" enthält.

        Deine Fehlermeldung legt nahe, dass der Pfad im String von $toinclude zu einer nicht vorhandenen Datei weist!

        Ich gehe eher davon aus, dass die notation
        include "$toinclude";
        falsch ist!...

        g johannes

        1. Lieber johannes,

          Ich gehe eher davon aus, dass die notation
          include "$toinclude";
          falsch ist!...

          sie ist nicht "falsch", sondern unnötig kompliziert. Ein einfaches include $toinclude; hätte hier genügt.

          Aber zu Deiner Fehlermeldung: Ich hatte manchmal auch so einen Fall, in welchem einfachste Pfadangaben nicht geschluckt wurden. Wenn Du also relative Pfadangaben machst, dann stelle doch ein "./" voran! Das tut nicht sonderlich weh und hat bei mir schon manches Mal geholfen.

          include './'.$toinclude;

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. jetzt funktioniert's!
            thx; johannes