Truncate
03-08-2006, 17:32
Hallo,
kann man das ev. kürzer machen? Ist auf Nummer sicher aufgebaut,
also nicht bloß include($_GET['go']); und fertig...
if(isset($_GET['go']))
{ if(file_exists("php/".$_GET['go'].".php"))
{
include("php/".$_GET['go'].".php");
}
else
{
include("php/home.php");
}
}
else
{include("php/home.php");}
Das wäre schon wieder unsinnig oder:
if(isset($_GET['go']) && if(file_exists("php/".$_GET['go'].".php"))
Original geschrieben von Truncate
Das wäre schon wieder unsinnig oder: wieso?
Original geschrieben von Truncate
Ist auf Nummer sicher aufgebaut,
also nicht bloß include($_GET['go']); und fertig...
so so, auf nummer sicher.
1. relative pfadangaben sind erlaubt, ala: ../../
2. ist magic_quotes_gpc aus, kann man durch nullbytes sogar dein ".php" austricksen und jede beliebige datei includen
Truncate
03-08-2006, 18:03
Original geschrieben von 3DMax 1. relative pfadangaben sind erlaubt, ala: ../../
Gut, das heißt also ich muss $_GET['go'] mittels RegEx überprüfen,
ob nur Buchstaben und Zahlen darin vorkomme, richtig?
Original geschrieben von 3DMax 2. ist magic_quotes_gpc aus, kann man durch nullbytes sogar dein ".php" austricksen und jede beliebige datei includen
Da müßte dann obige RegEx auch ausreichen oder? Ich mein Punkte sind ja dann nicht mehr erlaubt...
$valid_sites = array('home','impressum','foo');
if(isset($_GET['go']) AND in_array($_GET['go'], $valid_sites)){
include('../includes/inc.'.$_GET['go'].'php');
}else{
include('../includes/inc.home.php');
}
Ma so als Anstoß.
file_exists kann übrigens nicht die Existenz von entfernten Dateien prüfen.
Von daher müsste man also um was einzuschleusen auf der selben Kiste sein - bei Shared-Hosting aber möglich.
Anmerkung: Diese Funktion kann nicht mit entfernten Dateien arbeiten, da der Zugriff auf die Datei, die bearbeitet werden soll, über das Dateisystem des Servers möglich sein muss.
aus: http://de3.php.net/file_exists
ja, die idee mit dem regex ist gut.
Original geschrieben von Truncate
Da müßte dann obige RegEx auch ausreichen oder? Ich mein Punkte sind ja dann nicht mehr erlaubt...
muss ja nicht unbedingt ein punkt vorkommen:../../../etc/passwd%00
erschlägst du aber trotzdem damit.
pregos vorschlag mit der whitelist ist sehr zu empfehlen. also dateien explizit zu erlauben, anstatt versuchen, die parameter zu bereinigen.
Truncate
03-08-2006, 18:29
Gut, danke euch beiden!
Nehme die Array-Variante... weil ich muss die restlichen angehängten Parameter sowieso schon mittels (langsamer) RegEx checken.
Original geschrieben von Truncate
Nehme die Array-Variante...
ich hätte beide genommen ;)