Seite 1 von 1

register_globals-Schutz

Verfasst: 08.02.2008 11:25
von S2B
Hi,

beim Stöbern in larsneos Blog ist mir aufgefallen, dass dort zum Zurücksetzen der durch register_globals gesetzten Variablen genau das umgekehrte Verfahren verwendet wird, wie ich es in meinen Seiten einsetze:

Code: Alles auswählen

if (ini_get('register_globals') == '1' || strtolower(ini_get('register_globals')) == 'on')
{
	$vars = array('_REQUEST', '_SERVER', '_ENV');
	foreach ($vars as $var)
	{
		foreach ($$var as $name => $value)
		{
			if (isset($$name) && $$name === $value)
			{
				unset($$name);
			}
		}
	}
	unset($vars, $var, $name, $value);
}
Jetzt meine Frage: Sind beide Verfahren gleich effektiv oder übersehe ich bei meiner Lösung etwas?

Verfasst: 08.02.2008 11:45
von larsneo
alternativ zu der im blog vorgestellten lösung hier die 'offizielle' (und wahrscheinlich auch beste) variante von stefan esser aus der php faq:

Code: Alles auswählen

<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
    if (!ini_get('register_globals')) {
        return;
    }

    // Might want to change this perhaps to a nicer error
    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die('GLOBALS overwrite attempt detected');
    }

    // Variables that shouldn't be unset
    $noUnset = array('GLOBALS',  '_GET',
                     '_POST',    '_COOKIE',
                     '_REQUEST', '_SERVER',
                     '_ENV',     '_FILES');

    $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])) {
            unset($GLOBALS[$k]);
        }
    }
}

unregister_GLOBALS();

?>

Re: register_globals-Schutz

Verfasst: 08.02.2008 12:16
von S2B
S2B hat geschrieben:Jetzt meine Frage: Sind beide Verfahren gleich effektiv oder übersehe ich bei meiner Lösung etwas?
... :P

Mir ist beim Vergleich der beiden Methoden aufgefallen, dass ich $_SESSION-Variablen nicht mit einbeziehe. Gibt es sonst noch etwas?

Verfasst: 08.02.2008 12:38
von PhilippK
PHP hat geschrieben:Whether or not to register the EGPCS (Environment, GET, POST, Cookie, Server) variables as global variables.
Gruß, Philipp

Verfasst: 08.02.2008 13:09
von S2B
Danke, das hilft mir weiter.

Ich bin gerade noch auf die Erklärung von variables_order gestoßen. Da Superglobalen demnach nicht unbedingt definiert sein müssen, macht larsneos Code mehr Sinn als meiner.