处理register_globals

时间:2010-01-08 08:38:58

标签: 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?感谢。

2 个答案:

答案 0 :(得分:4)

有一些处理register_globals described in the PHP manual的方法。 register_globals设置can't be set at runtime ini_set() <?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(); ?> ,因此如果您无法使用.htaccess或Web服务器配置文件,那么提供的方法就是官方解决方法。

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

{{1}}

答案 1 :(得分:3)

您可以将php_flag register_globals off添加到.htaccess文件中,但并非所有服务器都接受此操作。因此,如果您计划发布框架,那可能不是一个好主意。