Umgang mit Register_Globals
-
19-09-2019 - |
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.
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.