$ GLOBALS = array();?

时间:2012-05-14 10:21:02

标签: php

简单地将$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']等是不是很糟糕(“不应该设置的变量”,如示例所示 - 这是否真的如此? )?

更新

我在下面自己回答了这个问题。傻傻的我没想早点。

2 个答案:

答案 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)相同,这绝对不是我想要的。问题回答了。