4

我不确定这是否会被标记为社区 wiki,但无论如何:

有没有一种简单的方法可以杀死 register_globals?我正在开发一个 PHP 框架,现在,我只是将脚本设置为在 register_globals 为 On 时终止。虽然我更喜欢强迫人们禁用它,但有些服务器仍然有它。

我知道在 PHP 5.3.0 中 register_globals 已被弃用,在 PHP 6 中它将被完全删除,但在它仍然存在时处理它总是一件好事。

我看到了一些方法,我目前正在考虑使用这个:

$temp = array_merge($_GET, $_POST, $_COOKIE);
foreach($temp as $k => $v) {
    如果(isset($$k))未设置($$k);
}

不过这里有一些问题。这是资源激励,特别是当有大量输入数据时。我不确定在运行时禁用它是否会起作用,例如:

ini_set('register_globals', 'Off')

有没有我没听说过的更好的方法来摆脱 register_globals?谢谢。

4

2 回答 2

5

PHP 手册中描述了处理 register_globals 的方法。register_globalsini 设置无法在运行时通过设置ini_set(),因此如果您无法使用 .htaccess 或 Web 服务器配置文件进行设置,则提供的方法将是官方的解决方法。

它基本上提供了这段代码来模拟兼容性:

<?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();

?>
于 2010-01-08T08:56:53.327 回答
3

您可以添加php_flag register_globals off到您的 .htaccess 文件中,尽管并非所有服务器都接受这一点。因此,如果您打算发布您的框架,这可能不是一个好主意。

于 2010-01-08T08:47:14.037 回答