1

$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']等是否不好(“不应取消设置的变量”如示例所述——真的是这样吗?)?

更新:

我在下面自己回答了这个问题。愚蠢的我没有早点尝试。

4

2 回答 2

2

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 被编辑了

..因为它包含胖手指 - 意外的结果来自一个错字!

于 2012-05-14T10:25:09.517 回答
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)这绝对不是我想要的。问题已回答。

于 2012-05-14T11:00:56.810 回答