ist include unsicher?
johannes
- php
hallo.
Ich möchte, bei meiner seite, das menü per include einbinden.
Jetzt habe ich irgendwo gelesen, dass man zusätzliche vorkehrungen
treffen muss, um zu überprüfen, ob die codezeilen eingebunden werden
dürfen, da sonst alles unsicher ist.
genaueres weiß ich nicht, deshalb frag' ich lieber mal nach.
g johannes
Tach.
Ich möchte, bei meiner seite, das menü per include einbinden.
Enthält diese "Menüdatei" denn selber PHP-Code oder handelt es sich um reines HTML? Falls letzteres zutrifft, solltest du lieber readfile() statt include() benutzen.
Jetzt habe ich irgendwo gelesen, dass man zusätzliche vorkehrungen
treffen muss, um zu überprüfen, ob die codezeilen eingebunden werden
dürfen, da sonst alles unsicher ist.
genaueres weiß ich nicht, deshalb frag' ich lieber mal nach.
Falls der Seitenbesucher von außen Einfluß darauf nehmen soll, welche Datei eingebunden wird, ist eine Überprüfung der entsprechenden Usereingaben in der Tat wichtig. Hast du so etwas vor oder möchtest du einfach immer nur unverändert die "Menüdatei" einbinden?
Tach.
Ich möchte, bei meiner seite, das menü per include einbinden.
Enthält diese "Menüdatei" denn selber PHP-Code oder handelt es sich um reines HTML? Falls letzteres zutrifft, solltest du lieber readfile() statt include() benutzen.
aha
Jetzt habe ich irgendwo gelesen, dass man zusätzliche vorkehrungen
treffen muss, um zu überprüfen, ob die codezeilen eingebunden werden
dürfen, da sonst alles unsicher ist.
genaueres weiß ich nicht, deshalb frag' ich lieber mal nach.Falls der Seitenbesucher von außen Einfluß darauf nehmen soll, welche Datei eingebunden wird, ist eine Überprüfung der entsprechenden Usereingaben in der Tat wichtig. Hast du so etwas vor oder möchtest du einfach immer nur unverändert die "Menüdatei" einbinden?
nein, immer die gleiche.
g johannes
Lieber johannes,
wenn Du den Pfad zum zu inkludierenden Script variabel hälst, dann musst Du sicherstellen, dass in der entsprechenden Variable auch nur das stehen kann, was Du auch dafür vorgesehen hast.
// Sicher, weil fest vorgegeben:
$script = 'scripts/mein_script.php';
include ($script);
// grob fahrlässig:
$script = $_GET['include_pfad'];
include ($script);
// so geht es schon eher:
$erlaubte_scripts = array(
'scripts/navi.php',
'fehler.php',
'gaestebuch/gb.php'
);
$script = false;
if (in_array($_GET['include_pfad'], $erlaubte_scripts)
include ($_GET['include_pfad']);
// das ist auch sicher:
$scripte = array(
'1' => 'scripts/navi.php',
'2' => 'fehler.php',
'3' => 'gaestebuch/gb.php'
);
if (array_key_exists($_GET['include_pfad'], $scripte))
include($scripte[$_GET['include_pfad']]);
Hoffentlich ist das alles jetzt auch in Ordnung so...
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Ich grüsse den Cosmos,
Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?
include('/pfad/zum/script/' . $_GET['file'] . '.php');
Ich nutze dieses System und hab noch keine Möglichkeit gefunden, irgendwie fremde Seite einzuschleusen. Falls ich was übersehen hab, lerne ich aber gerne dazu ;)
Möge das "Self" mit euch sein
Hallo Manuel,
Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?
include('/pfad/zum/script/' . $_GET['file'] . '.php');
Nein. Was ist wenn $_GET['file'] ../../foo ist?
Grüße
Jasmin
Hallo
Hallo Manuel,
Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?
include('/pfad/zum/script/' . $_GET['file'] . '.php');
Nein. Was ist wenn $_GET['file'] ../../foo ist?
Dann wird es dies (höchstwahrscheinlich) nicht geben. /pfad/zum/script/../../foo ist ja schon ein ungewöhnlicher Pfadaufbau. :-)
Eine vorhergehende Prüfung auf Plausibilität sollte schon sein. Wenn wir aber schon dort sind, kann man auch gleich Felix' System der Überprüfung auf Existenz verwenden.
Tschö, Auge
Alles klar...
thx, g, Johannes
Ich grüsse den Cosmos,
include('/pfad/zum/script/' . $_GET['file'] . '.php');
Nein. Was ist wenn $_GET['file'] ../../foo ist?
Das stimmt. Ich wusste doch, ich hab was übersehen ;)
Dann werd ich wohl aus $_GET['file'] alles rausschneiden, was nach Pfad aussieht. Im Prinzip also
ereg_replace('^.*/', '', $_GET['file'])
Dann dürfte es unmöglich sein, dieses System zu infiltrieren. Oder hab ich noch was übersehen?
Möge das "Self" mit euch sein
Hallo Manuel,
Würde es denn nicht ausreichen, einen fixen Pfad vorzugeben, in der die Datei liegen muss?
include('/pfad/zum/script/' . $_GET['file'] . '.php');
Nein. Was ist wenn $_GET['file'] ../../foo ist?
Nachtrag: Dieser Trick funktioniert nicht, wenn man einen Ordner als Alias in Apache angibt, also als eine Art "Pseudoordner". Eine andere Möglichkeit wäre ein Subdomain, z.B. http://include.example.com/.
Grüße
Jasmin
Noch Etwas:
Ich will eine datei includen, deren name in $toinclude gespeichert ist...
wie stell ich das an?
bei
include "$einevariable";
erhalte ich :
Warning: main() [function.include]: Failed opening '' for inclusion (include_path='.:') in /usr/export/www/vhosts/funnetwork/hosting/johannesswo/mamaphp/make.php on line 84
siehe auch http://johannesswo.jo.funpic.de/mamaphp/home.php
g johannes
Lieber johannes,
Ich will eine datei includen, deren name in $toinclude gespeichert ist...
wie stell ich das an?
der Inhalt von $toinclude muss ein String sein. Dieser String referenziert eine Datei entweder absolut (vom Betriebssystem aus gesehen, unter dem PHP läuft!), oder relativ (wie z.B. '../verz/datei.php'). Deine Fehlermeldung legt nahe, dass der Pfad im String von $toinclude zu einer nicht vorhandenen Datei weist!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Lieber johannes,
Ich will eine datei includen, deren name in $toinclude gespeichert ist...
wie stell ich das an?der Inhalt von $toinclude muss ein String sein.
ist er:
var_dump($tooinclude);
sagt: string(16) "home_content.php"
Dieser String referenziert eine Datei entweder absolut (vom Betriebssystem aus gesehen, unter dem PHP läuft!), oder relativ (wie z.B. '../verz/datei.php').
Die datei liegt im selben Ordner wie die includierende datei, genau wie der String auch nur den dateinamen "home_content.php" enthält.
Deine Fehlermeldung legt nahe, dass der Pfad im String von $toinclude zu einer nicht vorhandenen Datei weist!
Ich gehe eher davon aus, dass die notation
include "$toinclude";
falsch ist!...
g johannes
Lieber johannes,
Ich gehe eher davon aus, dass die notation
include "$toinclude";
falsch ist!...
sie ist nicht "falsch", sondern unnötig kompliziert. Ein einfaches include $toinclude;
hätte hier genügt.
Aber zu Deiner Fehlermeldung: Ich hatte manchmal auch so einen Fall, in welchem einfachste Pfadangaben nicht geschluckt wurden. Wenn Du also relative Pfadangaben machst, dann stelle doch ein "./" voran! Das tut nicht sonderlich weh und hat bei mir schon manches Mal geholfen.
include './'.$toinclude;
Liebe Grüße aus Ellwangen,
Felix Riesterer.
jetzt funktioniert's!
thx; johannes