Sicheres includieren
Quatschkopf
- php
0 Mathias Brodala1 dedlfix
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
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
das könnte sich aber noch ändern , und wenn man eine ausbaubare site-engine bauen will , ist include() doch besser..oder?
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®
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
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> </li>
Sowas macht man doch nicht um einen Abstand zu erhalten. Dafür bietet CSS bessere Möglichkeiten.
echo "$verabschiedung $name";
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