register_globals-Schutz

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

register_globals-Schutz

Beitrag 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?
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag 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();

?>
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Re: register_globals-Schutz

Beitrag 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?
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

PHP hat geschrieben:Whether or not to register the EGPCS (Environment, GET, POST, Cookie, Server) variables as global variables.
Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag 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.
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Antworten

Zurück zu „Coding & Technik“