Jim*_*Lin 4 php register-globals
我不确定将其标记为社区 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) {
if(isset($$k)) 未设置($$k);
}
不过这里有一些问题。它是资源激励,特别是当有大量输入数据时。我不确定在运行时禁用它是否有效,例如:
ini_set('register_globals', 'Off')
Run Code Online (Sandbox Code Playgroud)
有没有我没有听说过的更好的方法来摆脱 register_globals?谢谢。
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();
?>
Run Code Online (Sandbox Code Playgroud)