微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 处理register_globals

我不确定这是否可以被标记为社区维基,但无论如何:

是否有一种简单的方法可以杀死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) {
    if(isset($$k)) unset($$k);
}

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

ini_set('register_globals', 'Off')

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

解决方法:

有一些处理register_globals described in the PHP manual方法.region_globals ini通过ini_set()设置can’t be set at runtime,所以如果你不能用.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();

?>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐