Gast
2005-11-10, 19:09:12
Hallo,
da bei mir standardmäßig register globals auf on steht (gemieteter webspace), möchte ich das natürlich per script deaktivieren.
dazu hab ich einfach mal folgendes verwendet:
// Turn register globals off
function unregister_GLOBALS() {
if (!ini_get('register_globals')) return;
if (isset ($_REQUEST['GLOBALS'])) die('GLOBALS overwrite attempt detected');
// Variables that shouldn't be unset (Session? Is das ok? Brauch das eigentlich schon, hab es nachträglich noch hinzugefügt, da es sonst nicht funktioniert hätte)
// man beachte hier, dass _GET auch zu $noUnset gehört
$noUnset = array ('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', '_SESSION');
$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset ($_SESSION) && is_array($_SESSION) ? $_SESSION : array ());
foreach ($input as $k => $v) {
if (!in_array($k, $noUnset) && isset ($GLOBALS[$k])){
//echo "unset: ".$GLOBALS[$k]." - ";
unset ($GLOBALS[$k]);
//echo "done: ".$GLOBALS[$k]."<br />";
}
}
}
unregister_GLOBALS();
so, jetzt soll man auf globale variablen nicht mehr zugreifen können... ist auch so. wenn ich
$foo = "foo";
habe und in der URL oben $foo auf "bar" setze dann steht das da nicht drin.
So weit, so gut, mir gehts jetzt eigentlich mehr um die Übergabe der Variablen mit $_GET. wenn ich auf einer seite (test1.php) habe:
$foo = "sowieso"
//gibt sowieso aus und kann in der URL nicht geändert werden
echo "testvar: ".$foo;
echo "<a href='home/test2.php?foo=bla'>bla</a>";
und auf einer anderen seite test2.php
//kann durch angabe in der URL geändert werden
echo "testvar: ".$_GET['foo'];
dann gibt er mir auch bla aus. falls ich aber nun foo auf 123xy in der URL setze und reloade, dann wird der wert auch für die variable $_GET['foo'] in test2.php übernommen, d.h. es steht da: testvar: 123xy.
jetzt frag ich mich natürlich, warum ich die globals deaktiviert habe, wenn es trotzdem noch möglich ist, auf den wert der variablen ($_GET) in der url zuzugreifen, wenn ich sie z.B. an eine andere seite übergebe. ich meine, ich könnte ja gleich eine globale variable übergeben (wenn ich nichts kritisches damit mache, wie z.b. menu-navi), warum sollte ich dann $_GET benutzen, wenn offenbar kein unterschied besteht.
kann das sein, dass PHP hier ziemlicher Schrott ist?
hab ich da irgendwas falsch dran verstanden?
kann man das unterbinden? ich will das nicht.
da bei mir standardmäßig register globals auf on steht (gemieteter webspace), möchte ich das natürlich per script deaktivieren.
dazu hab ich einfach mal folgendes verwendet:
// Turn register globals off
function unregister_GLOBALS() {
if (!ini_get('register_globals')) return;
if (isset ($_REQUEST['GLOBALS'])) die('GLOBALS overwrite attempt detected');
// Variables that shouldn't be unset (Session? Is das ok? Brauch das eigentlich schon, hab es nachträglich noch hinzugefügt, da es sonst nicht funktioniert hätte)
// man beachte hier, dass _GET auch zu $noUnset gehört
$noUnset = array ('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', '_SESSION');
$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset ($_SESSION) && is_array($_SESSION) ? $_SESSION : array ());
foreach ($input as $k => $v) {
if (!in_array($k, $noUnset) && isset ($GLOBALS[$k])){
//echo "unset: ".$GLOBALS[$k]." - ";
unset ($GLOBALS[$k]);
//echo "done: ".$GLOBALS[$k]."<br />";
}
}
}
unregister_GLOBALS();
so, jetzt soll man auf globale variablen nicht mehr zugreifen können... ist auch so. wenn ich
$foo = "foo";
habe und in der URL oben $foo auf "bar" setze dann steht das da nicht drin.
So weit, so gut, mir gehts jetzt eigentlich mehr um die Übergabe der Variablen mit $_GET. wenn ich auf einer seite (test1.php) habe:
$foo = "sowieso"
//gibt sowieso aus und kann in der URL nicht geändert werden
echo "testvar: ".$foo;
echo "<a href='home/test2.php?foo=bla'>bla</a>";
und auf einer anderen seite test2.php
//kann durch angabe in der URL geändert werden
echo "testvar: ".$_GET['foo'];
dann gibt er mir auch bla aus. falls ich aber nun foo auf 123xy in der URL setze und reloade, dann wird der wert auch für die variable $_GET['foo'] in test2.php übernommen, d.h. es steht da: testvar: 123xy.
jetzt frag ich mich natürlich, warum ich die globals deaktiviert habe, wenn es trotzdem noch möglich ist, auf den wert der variablen ($_GET) in der url zuzugreifen, wenn ich sie z.B. an eine andere seite übergebe. ich meine, ich könnte ja gleich eine globale variable übergeben (wenn ich nichts kritisches damit mache, wie z.b. menu-navi), warum sollte ich dann $_GET benutzen, wenn offenbar kein unterschied besteht.
kann das sein, dass PHP hier ziemlicher Schrott ist?
hab ich da irgendwas falsch dran verstanden?
kann man das unterbinden? ich will das nicht.