raphaelp
Neues Mitglied
Achtung, dieses Tutorial wurde aktualisiert und ist jetzt Teil der FAQ :
http://www.html.de/fpost58456.html#58456
Da in diesem forum oft das selbe gefragt wird, wir fuer diese frage aber nur mehrere halbfertige Threads zur verfuegung stellen, habe ich diesen Thread fuer eine einfuehrung in die Methodik der inkludierung von dateien ueber die URL geschrieben. Folgendes fallbeispiel:
Wie man es nicht machen sollte
Meistens wird dies ueber PHP Switch geloest, doch hier erstmal der grund weshalb man diesen ganzen aufwand betreibt. Man koennte ja eigentlich auch einfach nur sagen:
naja, wenn das leben bloss so schoen waere: Dadurch kann ein "Hacker" einfach auch folgendes eingeben:
und schon kann unter umstaenden dem Angreiffer wichtige information ueber dein System gegeben werden. Jetzt gaebe es z.b. noch die moeglichkeit:
und ueber
das ganze auf dateien mit der endung .php zu beschraenken. Jedoch kann unter umstaenden passieren, dass wenn PHP skripte an falschen stellen inkludiert werden, auch wichtige informationen ueber ein system preisgeben. Deshalb werden BEIDE methoden NICHT EMPFOHLEN!. Eine sichere methode waere ein sogenannter PHP Switch
Die Lösung mit switch
und das PHP Skript dazu:
jetzt ist es hier aber so, dass sowas ziemlichen aufwand bedeutet, wenn du mehrere dateien hinzufuegen willst (du muesstest ja immer wieder das selbe tippen - NICHT EFFIZIENT). Deshalb hier 2 effizientere methoden:
Auf ein Verzeichnis beschränken
Indem du das include auf ein verzeichnis beschraenkst, aus dem der besucher nicht "ausbrechen" kann - somit kannst du dort alle zu inkludierenden dateien rein tun, und bist hiermit abgesichert. Beispiel: Deine dateien sind wie folgt abgespeichert:
Eine andere, und meine persoenliche lieblingsmethode ist eine umschreibung, bzw. reduzierung eines switches auf einen array. klingt jetzt mega-kompliziert, aber ist viel einfacher als alles andere :)
Reduzierung auf ein Array
und das PHP skript dazu:
Das prinzip einer sogenannten "White-List" (http://de.wikipedia.org/wiki/Whitelist) ist hier besonders effizient und bedienerfreundlich angewendet. Wenn ich eine seite mit 200 zu inkludierenden dateinamen habe, muss ich nur jedes mal den dateinamen in die array schreiben, nicht das ganze 'case "dateiname"' ... usw usw. Die zwei zeilen darunter bleiben bestehen, und muessen nicht erweitert werden.
So, das war's, hoffe der thread bringt einigen was.
PS: waere dir dankbar cracki wennde den sticky machen koenntest oder so, hab mir so viel muehe gegeben!
Anmerkungen
1) Falls keinerlei php code "includiert" werden soll bietet sich die Benutzung von readfile() [ www.php.net/readfile ] an um Sicherheitslücken zu vermeiden.
2) Die Lösung mit den Arrays lässt sich noch aufbohren:
MOD-EDIT: [ php ] tags durch [ code ] ersetzt wegen fehler des forums & Anmerkungen
http://www.html.de/fpost58456.html#58456
Da in diesem forum oft das selbe gefragt wird, wir fuer diese frage aber nur mehrere halbfertige Threads zur verfuegung stellen, habe ich diesen Thread fuer eine einfuehrung in die Methodik der inkludierung von dateien ueber die URL geschrieben. Folgendes fallbeispiel:
Ich habe ne Seite mit 4 dateien, kontakt.php - news.php - haupt.php - index.php, und will nun ueber die index.php, welche mein Template enthaelt, moeglichst sicher und wartungsarm die haupt.php, news.php und kontakt.php inkludieren, und zwar ueber die URL.
Wie man es nicht machen sollte
Meistens wird dies ueber PHP Switch geloest, doch hier erstmal der grund weshalb man diesen ganzen aufwand betreibt. Man koennte ja eigentlich auch einfach nur sagen:
index.php?datei=kontakt.php oder
index.php?datei=news.php oder
index.php?datei=haupt.php
Code:
<?php
include $_GET['datei'];
?>
naja, wenn das leben bloss so schoen waere: Dadurch kann ein "Hacker" einfach auch folgendes eingeben:
index.php?datei=/etc/passwd
und schon kann unter umstaenden dem Angreiffer wichtige information ueber dein System gegeben werden. Jetzt gaebe es z.b. noch die moeglichkeit:
index.php?datei=haupt
und ueber
Code:
<?php
include($_GET['datei'].".php");
?>
das ganze auf dateien mit der endung .php zu beschraenken. Jedoch kann unter umstaenden passieren, dass wenn PHP skripte an falschen stellen inkludiert werden, auch wichtige informationen ueber ein system preisgeben. Deshalb werden BEIDE methoden NICHT EMPFOHLEN!. Eine sichere methode waere ein sogenannter PHP Switch
Die Lösung mit switch
index.php?datei=kontakt
und das PHP Skript dazu:
Code:
<?php
switch ($_GET['datei']) {
case "kontakt":
include 'kontakt.php';
break;
case "news":
include 'news.php';
break;
// ... mehrere dateien in der selben art anreihen
// die standard datei
default:
include 'haupt.php';
}
?>
jetzt ist es hier aber so, dass sowas ziemlichen aufwand bedeutet, wenn du mehrere dateien hinzufuegen willst (du muesstest ja immer wieder das selbe tippen - NICHT EFFIZIENT). Deshalb hier 2 effizientere methoden:
Auf ein Verzeichnis beschränken
Indem du das include auf ein verzeichnis beschraenkst, aus dem der besucher nicht "ausbrechen" kann - somit kannst du dort alle zu inkludierenden dateien rein tun, und bist hiermit abgesichert. Beispiel: Deine dateien sind wie folgt abgespeichert:
index.php
include\kontakt.php
include\haupt.php
include\news.php
Code:
<?php
// den besucher im aktuellen Verzeichnis "einsperren":
include 'include/' . basename($_GET['datei']) . '.php';
?>
Eine andere, und meine persoenliche lieblingsmethode ist eine umschreibung, bzw. reduzierung eines switches auf einen array. klingt jetzt mega-kompliziert, aber ist viel einfacher als alles andere :)
Reduzierung auf ein Array
index.php?datei=kontakt
und das PHP skript dazu:
Code:
<?php
// hier kann man beliebig viele dateien anhaengen!
// die standard-seite ist an erster stelle.
$whiteList = array('haupt','news','kontakt');
if (in_array($_GET['datei'],$whiteList)) {
include $_GET['datei'].'.php';
}
else {
include $whiteList[0].'php';
}
?>
Das prinzip einer sogenannten "White-List" (http://de.wikipedia.org/wiki/Whitelist) ist hier besonders effizient und bedienerfreundlich angewendet. Wenn ich eine seite mit 200 zu inkludierenden dateinamen habe, muss ich nur jedes mal den dateinamen in die array schreiben, nicht das ganze 'case "dateiname"' ... usw usw. Die zwei zeilen darunter bleiben bestehen, und muessen nicht erweitert werden.
So, das war's, hoffe der thread bringt einigen was.
PS: waere dir dankbar cracki wennde den sticky machen koenntest oder so, hab mir so viel muehe gegeben!

Anmerkungen
1) Falls keinerlei php code "includiert" werden soll bietet sich die Benutzung von readfile() [ www.php.net/readfile ] an um Sicherheitslücken zu vermeiden.
2) Die Lösung mit den Arrays lässt sich noch aufbohren:
Code:
<?php
// hier kann man beliebig viele dateien anhaengen!
// die standard-seite ist an erster stelle.
$whiteList = array(
'haupt' => '../includes/data/main.content',
'news' => '../includes/database/news.php',
'kontakt' => '../includes/static/contact.content'
);
if(array_key_exists('datei', $_GET)) {
if (array_key_exists($_GET['datei'],$whiteList)) {
include $whiteList[$_GET['datei']];
}
else {
include $whiteList['haupt'];
}
}
else {
include $whiteList['haupt'];
}
?>
MOD-EDIT: [ php ] tags durch [ code ] ersetzt wegen fehler des forums & Anmerkungen