$GLOBALS
简单地设置为空数组有什么问题吗?我想扭转register_globals
它在哪里打开并且一个人无权访问.ini
文件的效果,而不是遍历每个相关的超级全局变量并在必要时取消设置,跳过这样的元素$GLOBALS['_POST']
,$GLOBALS['_GET']
如通常所做的那样,我想知道是否可以将它们全部删除。
有没有可能由此产生的问题?我不打算引用$GLOBALS
数组,因为任何与范围无关的变量要么设置在相关的超级全局($_GET
,$_POST
等)中,要么存储为相关注册表类的属性。
有关信息,http ://www.php.net/manual/en/faq.misc.php#faq.misc.registerglobals 上的常见问题解答具有以下模拟register_globals = 0
:
<?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();
?>
大概执行unset($GLOBALS[$k]);
与执行相同,$GLOBALS = array();
只是后者删除了所有内容并且只涉及一行代码。
那么问题是: unset $GLOBALS['_GET']
,$GLOBALS['_PUT']
等是否不好(“不应取消设置的变量”如示例所述——真的是这样吗?)?
更新:
我在下面自己回答了这个问题。愚蠢的我没有早点尝试。