Cookie setzen und Hauptseite beibehalten -> Headerproblem



  • Ich habe ein kleines Loginmenü, dass immer sichtbar sein soll und welches nicht auf eine eigene Seite linken soll:

    index.php
    <?php
       //Menü etc. bspLink: <a href="index.php?page=mypage.php">mypage</a>
       ...
       //Hauptseite wird includiert
       if(isset($_GET["page"])) include($_GET["page"]);
    ?>
    

    Wenn ich jetzt aber sowas mache, wie:

    <a href="index.php?page=cooie.php&action=set">login</a>
    

    Mault php - zurecht - dass der Header schon gesendet wurde und setcookie(...) nicht mehr machen möchte.
    Allerdings geht mir bei:

    <a href="cookie.php?action=set">login</a>
    

    ja die Hauptseite -> Menüs, etc verloren, und wieder auf sie zurückzulinken, finde ich unschön, besonders, wenn Javascript deaktiviert ist.

    Stelle ich mich irgendwie zu doof an, sprich gibt es eine triviale Lösung dafür?

    MFG John



  • Hat sich erledigt, habs jetz so gelöst:

    index.php
    <?php
       if(isset($_GET["cookie"])) include("cookie.php");
       //HEAD
       ...
       //BODY
       if(isset($_GET["page"])) include($_GET["page"]);
    ?>
    


  • Man kann auch am Anfang des Scripts einmal ob_start() aufrufen und am Ende einmal ob_end_flush() dann isses schnuppe wann du header() oder setcookie() etc. aufrufst.
    Allerdings wird die komplette Seite erst ab ob_end_flush() an den Browser gesendet 😉



  • Was viel wichtigeres:

    if(isset($_GET["page"])) include($_GET["page"]);
    

    Sollte niemals gemacht werden.

    Dadurch können belibige Dateien im Dateisystem geladen werden, wenn nicht, sogar noch schlimmeres.
    Natuerlich sind Server evtl gegen sowas geschüzt. muss aber nich.

    ansonsten vielleicht auch menu und index seite auslagern und das aufgerufene script ist dann nur noch der teil die den cookis/Sessions/etc und das include und muss dann auch nicht immer neu geladen werden, da der gesammte content davon gekapselt ist.



  • Ich sehe das problem mit dem

    include($_GET["page"]);
    

    nicht.

    Empfindliche seiten enthalten immer eine Überprüfung des Userstatus und "*.php" Dateinhe zeigt er nicht an (zumindest auf meinem Server nicht, hab's gerade ausprobiert...).

    Ansonsten könnte ich ja auch noch ne Abfrage davorsetzeten:

    $mainpage = $_GET["page"];
    if($mainpgage != $forbiddenPage) include($mainpage);
    else include($errorpage);
    

    Wäre das besser, bzw. ausreichender Schutz?

    EDIT: Wie sieht eine bessere Struktur aus?

    MFG John



  • Naja. diese Problematik muss ja auch nicht auftauchen, KANN aber. Und damit es auf jedenfall sicher bleibt sollte man es schon anders machen.
    Gibt da aber ja auch verschiedene Ansätze(Verzeichnis überprüfung als Beispiel)

    und ich würds auf jedenfall eher so machen:

    switch($_GET[page])
    {
      case "info":
        require("info.php");
        break;
      case "download":
        require("dowanload.php");
        break;
      default:
        require("main.php");
    }
    

    weil sonst kriegt man eh ne Fehlermeldung/muss eine Fehlermeldung abfangen, wenn die datei die man angegeben hat nicht vorhanden ist.

    Oder man liest sowas aus einer DB...


Log in to reply