Frage

Ich bin mir nicht sicher, ob dies gut wäre, als Community -Wiki gekennzeichnet zu sein, aber trotzdem:

Gibt es eine einfache Möglichkeit, das Register_Globals zu töten? Ich arbeite an einem PHP -Framework und habe gerade das Skript so festgelegt, dass es registriert ist, wenn Register_Globals eingeschaltet ist. Obwohl ich lieber die Menschen zwinge, es zu deaktivieren, dort, dort sind Server, die das noch haben.

Ich weiß, dass in PHP 5.3.0 Register_Globals veraltet ist und in PHP 6 vollständig entfernt wird, aber es ist immer eine gute Sache, damit umzugehen, während es noch hier ist.

Ich habe einige Möglichkeiten gesehen und denke gerade darüber nach:

$temp = array_merge($_GET, $_POST, $_COOKIE);
foreach($temp as $k => $v) {
    if(isset($$k)) unset($$k);
}

Hier gibt es jedoch einige Probleme. Es ist Ressourcenanreize, insbesondere wenn es viele Eingabedaten gibt. Ich bin mir nicht sicher, ob das Deaktivieren der Laufzeit zum Beispiel funktionieren würde:

ini_set('register_globals', 'Off')

Gibt es einen besseren Weg, von dem ich noch nichts gehört habe, um Register_Globals loszuwerden? Vielen Dank.

War es hilfreich?

Lösung

Es gibt Methoden zum Umgang mit Register_Globals beschrieben im PHP -Handbuch. Das register_globals Ini -Einstellung kann nicht zur Laufzeit eingestellt werden durch ini_set(), Wenn Sie dies also nicht mit einer .htaccess- oder Webserverkonfigurationsdatei tun können, würde die dort vorgesehene Methode die offizielle Problemumgehung geben.

Grundsätzlich liefert es diesen Codeausschnitt, um die Kompatibilität nachzuahmen:

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

?>

Andere Tipps

Sie könnten hinzufügen php_flag register_globals off zu Ihrer .htaccess -Datei, obwohl nicht alle Server dies akzeptieren. Wenn Sie also vorhaben, Ihr Framework zu veröffentlichen, ist dies möglicherweise keine gute Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top