PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] register globals - kapier den sinn nicht


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.

MadMan2k
2005-11-10, 19:40:31
schon richtig so - mit register_globals, kannst du beliebige Variablen über GET Überschreiben, was ohne nicht mehr geht.

Gast
2005-11-10, 20:43:54
danke für die antwort.

schlussfolgere ich dann richtig, dass man aus sicherheitsgründen werte, die mit $_GET übergeben wurden, nicht in variablen schreiben sollte bzw. da verwenden sollte, wo (sicherheits-)kritische operationen durchgeführt werden? (beispiel onlineshop)

wenn man das so betrachtet ist das eine heftige einschränkung, da man immer wieder die eingaben überprüfen muss. (deshalb bräuchte ich eine brauchbare klasse/funktion, die das zuverlässig für mich erledigen kann, da ich nicht jede eingabe die gemacht wird auf 100 verschiedene art und weisen abprüfen will)

mein hintergrund ist eigentlich der, dass ich (m)eine seite nach allen möglichen sicherheitsaspekten solide gegenüber benutzereingaben gestalten will.

hat jemand noch andere sehr gute quellen zu diesem thema auf lager ausser php.net/manual? wo findet man konkret informationen zu aktuellen sicherheitslücken bzgl. php? wo kann man da auf dem laufenden bleiben?

danke

MadMan2k
2005-11-10, 20:56:19
wenn du die Variablen aus GET manuell in lokalen Varaiblen speicherst, ist das weniger kritisch, da die manipulierbaren Varaiblen von vornherein bekannt sind.

Speziell zu Thema habe ich nichts, aber folgendes hängt eng damit zusammen:
http://de.wikipedia.org/wiki/SQL-Injection