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

有没有简单的方法来杀死register_globals?我正在研究PHP框架,现在,我只是设置脚本以终止register_globals on。尽管我更喜欢强迫人们禁用它,但 仍然可以使用的服务器。

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

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

$temp = array_merge($_GET, $_POST, $_COOKIE);
foreach($temp as $k => $v) {
    if(isset($$k)) unset($$k);
}

不过,这里有一些问题。这是资源激励措施,特别是当有很多输入数据时。我不确定在运行时禁用它是否有效,例如:

ini_set('register_globals', 'Off')

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

有帮助吗?

解决方案

有处理register_globals的方法 在PHP手册中描述. 。这 register_globals INI设置 无法在运行时设置 经过 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();

?>

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top