Quatschkopf: Sicheres includieren

Hi Community

Da ich meine seite auf php auf gebaut habe, widme ich mich nun dem sicheren includieren. Dazu habe ich eine Linkliste erstellt, in der alle Links enthalten sind.

Fals ihr verbesserungs/optimierungs vorschläge habt oder ein gutes Beispiel kennt. nur her damit. :-)

http://feuerwolf.fe.funpic.de/aa/index.txt
http://feuerwolf.fe.funpic.de/aa/namen.txt
http://feuerwolf.fe.funpic.de/aa/menu.txt

http://feuerwolf.fe.funpic.de/aa/index.htm

Danke schon im Voraus

Quatschkopf

  1. Hallo Quatschkopf.

    Fals ihr verbesserungs/optimierungs vorschläge habt oder ein gutes Beispiel kennt. nur her damit. :-)

    Faustregel: gibt es in der einzubindenden Datei keinerlei auszuführenden Programmcode, so ist readfile angebracht.

    Einen schönen Sonntag noch.

    Gruß, Mathias

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    debian/rules
    1. das könnte sich aber noch ändern , und wenn man eine ausbaubare site-engine bauen will , ist include() doch besser..oder?

      --
      __________________________-
      Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
      1. Moin!

        readfile()

        das könnte sich aber noch ändern , und wenn man eine ausbaubare site-engine bauen will , ist include() doch besser..oder?

        Das ist eine Frage der genauen Definition von "besser". Sicherer ist es definitiv nicht. Performanter auch nicht. Deshalb ist gerade bei einer "ausbaubaren site-engine" der Plan der Anfang von allem. Oder wie es in der Bibel heisst: "Am Anfang war das Wort."

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. Hi @all

          Das mit dem readfile hab ich mir angesehen, aber wieder verworfen. Da ich ohne anleitung das unterscheiden von seiten, die include und seiten, die readfile brauchen kaum hinbekommen werde. Zudem möchte ich das Ganze nicht noch mehr verkomplizieren. Ultimative Sicherheit gibt es sowieso nicht und mit den Massnahmen, die ich dank dedlfix nun treffen konnte, sollte ich doch ein erträgliches Mass an Sicherheit erreicht haben.

          Es bedankt sich für eure Vorschläge

          Quatschkopf

  2. echo $begrüßung;

    http://feuerwolf.fe.funpic.de/aa/index.txt

    <!--  hier wird das Linken vom menü bearbeitet -->  
    <?php include "namen.php"; ?>  
    <!-- ab hier beginnt die Index.html -->  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    

    HTML-Kommentare für PHP-Code ...
    Wenn du mal den erzeugten HTML-Code anschaust, steht da

    <!--  hier wird das Linken vom menü bearbeitet -->
      <!-- ab hier beginnt die Index.html -->
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    Das ist aus HTML-Sicht nicht sinnvoll. Außerdem bringt es einige Browser dazu, in den fehlerhaften Quirks-Mode zu schalten, wenn vor der Doctype-Angabe noch was steht.

    Mein Vorschlag: Verlagere die Kommentare in den PHP-Code.

    <?php include "$wert"; ?>

    Einfache Variablen müssen nicht in "" eingefasst werden. PHP bettet den Wert von $wert, der einen String ist, nochmal in einen String ein. Das ist überflüssig.

    $wert als Variablenname ist nicht besonders clever, da er nicht selbstredend ist. Mit beschreibenden Variablennamen lässt sich ein Script einfacher lesen. Ideal ist, wenn man die Intention dahinter erkennen kann. Was es ist, ergibt sich meist von selbst. Beispiel:

    $dingsbums_array = array();

    Das Array nochmals mit "array" im Namen zu bezeichnen ist überflüssig, da es sich bereits aus der Initialisierung ergibt, dass $dingsbums ein Array ist.

    http://feuerwolf.fe.funpic.de/aa/namen.txt

    $pa = "";  
    $na = array();  
    $la = array();
    

    Auch hier fände ich beschreibende Variablennamen lesbarer.

    $pa = "";  
      
    // Dazwischen viel Zeug  
      
    if ($_GET['pa'] <= 5)  
    {  
    $pa = $_GET['pa'];
    

    Das Initialisieren der Variabablen vor dem Gebrauch ist positiv anzumerken. Doch würde ich die Initialisierung direkt vor dem Gebrauch vornehmen, nicht gesammelt am Scipt-Anfang. Das Kopieren und Wiederverwenden von Code-Teilen ist einfacher, wenn der Code beieinander steht. Außerdem habe ich unten schon wieder vergessen, was oben irgendwann mal stand :-)

    Die Einrückung von Code innerhalb von Code-Blöcken ist wichtig, um den Überblick zu behalten. Das solltest du konsequenter beachten.

    if ($_GET['pa'] <= 5)  
    {  
    $pa = $_GET['pa'];  
      
    if ($pa == 1)  
    {  
     $wert = $la[1];  
             $untertitel = $na[1];  
    }  
    if ($pa == 2)  
    {  
     $wert = $la[2];  
             $untertitel = $na[2];  
    }  
    [...]  
    }
    

    Das Anlegen einer weiteren Variable aus den Werten von $_GET/$_POST/... ist oft gesehen, aber überflüssig. Als Begründung muss immer "$xx ist einfacher zu schreiben als $_GET['xx']" herhalten. Das verschleiert aber nur die Herkunft von Variablen.

    Das obige Konstrukt wäre auch lieber eine switch-Anweisung inklusive default-Zweig (Die Initialisierung der Variablen $wert und $untertitel am Script-Anfang kann dann auch unterbleiben.) geworden. Somit ist $_GET['pa'] nur einmal im switch-Kopf notiert und das Argument der umständlichen Schreiberei ist plötzlich gar keins mehr. $na und $la kann dann auch ganz wegfallen.

    http://feuerwolf.fe.funpic.de/aa/menu.txt

    <li><a href="index.php?pa=1"><?php echo "$na[1]" ?></a></li>  
    <li><a href="index.php?pa=2"><?php echo "$na[2]" ?></a></li>  
    <li><a href="index.php?pa=3"><?php echo "$na[3]" ?></a></li>  
    <li><a href="index.php?pa=5"><?php echo "$na[5]" ?></a></li>
    

    Hier sind wieder einfache Variablen in "" eingefasst. (Wo ist eigentlich Nummer 4 abgeblieben?)

    Das sieht eher danach aus, als ob hier eine Schleife angebracht ist, statt der Code-Wiederholung.

    Und das $na kann doch nicht wegfallen, weil es hier noch gebraucht wird. Allerdings gefällt mir der Aufbau der beiden Arrays $na und $la nicht. Alternativvorschlag:

    $menu = array(
        1 => array('Home', 'home.php'),
        2 => array('News', 'news.php');
        ...);

    Auch der switch-Statement-Vorschlag fällt weg zugunsten von:

    if (isset($_GET['pa']) and isset($menu[$_GET['pa']])) {
        $untertitel = $menu[$_GET['pa']][0];
        $datei = $menu[$_GET['pa']][1];
      } else {
        $untertitel = $menu[1][0];
        $datei = $menu[1][1];
      }

    Vor dem Zugriff auf Variablen, die außerhalb des Scripts gefüllt werden ist eine Zugriffsprüfung angebracht, deshalb das einleitende isset($_GET['pa']). Statt isset($menu[$_GET['pa']]) könnte man übrigens auch array_key_exists($_GET['pa'], $menu) notieren.

    Der Aufbau der Menüliste lässt sich nun mit einem

    foreach($menu as $pa => $menu_element)
        echo "<li><a href='index.php?pa=$pa'>$menu_element[0]</a></li>\n";

    erzeugen.

    <li>&nbsp;</li>

    Sowas macht man doch nicht um einen Abstand zu erhalten. Dafür bietet CSS bessere Möglichkeiten.

    echo "$verabschiedung $name";

    1. Vielen vielen Dank für deine Hilfe.

      Hab deine vorschläge umsetzen können. (txt dateien aktualisiert)
      War zwar alles andere als leicht aber ich habs geschaft.

      Als nächstes werde ich mich dem CSS widmen. Mal sehn, was sich machen lässt.

      Es bedankt sich

      Quatschkopf