简单地将$GLOBALS设置为空数组有什么问题吗?我想扭转register_globals的影响,因为它是打开的,而且一个人不能访问.ini文件,而不是在必要时迭代每个相关的超级全局和未设置的元素,跳过$GLOBALS['_POST']、$GLOBALS['_GET']等元素,就像通常所做的那样,我想知道只删除它们是否可以。
这是否会产生任何问题?我从来没有计划将$GLOBALS数组作为任何独立于作用域的变量来引用,或者在相关的超级全局($_GET、$_POST等)中设置。或将作为相关注册表类的属性存储。
关于信息,http://www.php.net/manual/en/faq.misc.php#faq.misc.registerglobals的FAQ有以下几个来模拟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();一样,只是后者删除了所有内容,只涉及一行代码。
那么问题是:取消$GLOBALS['_GET']、$GLOBALS['_PUT']等(“不应该取消设置的变量”,如示例所述-真的是这样吗?)
更新:
我已经在下面回答了这个问题。愚蠢的我没有早点尝试。
发布于 2012-05-14 10:25:09
PHP 手册说
$GLOBALS — References all variables available in global scope如果以典型的PHP方式使用“参考”一词,设置$GLOBALS=array()不会对您有所帮助,您需要:
foreach ($GLOBALS as $k=>$v) unset($$k);编辑:可以扩展到
foreach ($GLOBALS as $k=>$v)
if (substr($k,0,1)!='_')
unset($$k);只是为了安全!(没有尝试)
编辑2:
从Karoly的评论来看,如果您在类或函数中这样做,您需要
foreach ($GLOBALS as $k=>$v) {
global $$k;
unset($$k);
}编辑3是令人敬畏的
。。因为它有肥硕的手指
https://stackoverflow.com/questions/10581467
复制相似问题