简单地将$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();
的做法相同,只是后者删除所有内容并且只涉及一行代码。
接下来的问题是:取消设置$GLOBALS['_GET']
,$GLOBALS['_PUT']
等是不是很糟糕(“不应该设置的变量”,如示例所示 - 这是否真的如此? )?
更新
我在下面自己回答了这个问题。傻傻的我没想早点。答案 0 :(得分:2)
PHP Manual说
$GLOBALS — References all variables available in global scope
如果以典型的PHP方式使用'Refernences'这个词,设置$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被编辑了
..因为它含有肥胖的手指 - 意外的结果来自一个错字!
答案 1 :(得分:0)
我自己已经回答了部分。因为没有早点尝试我是愚蠢的:
$var = 'Hello, world!';
unset($GLOBALS['var']);
echo $var; // Notice: Undefined variable: var
$var = 'Hello, world!';
$GLOBALS = array();
echo $var; // Hello, world!
因此,简单地将$GLOBALS
设置为空数组不会取消设置全局变量。他们需要明确取消。
<强>更新强>
使用unset($GLOBALS['_GET']);
与使用unset($_GET)
相同,这绝对不是我想要的。问题回答了。