PHP中$GLOBALS变量和register_globals

最近,在阅wordpress的代码的时候,看到在设置环境的初期,有一些安全性和初始化的工作,其中,有一个函数wp_unregister_GLOBALS()有点意思,函数的具体内容是:

/**
* Turn register globals off.
*
* @access private
* @since 2.1.0
* @return null Will return null if register_globals PHP directive was disabled
*/
function wp_unregister_GLOBALS() {
if ( !ini_get( 'register_globals' ) )
return;

if ( isset( $_REQUEST['GLOBALS'] ) )
die( /*WP_I18N_GLOBALS_OVERWRITE*/'检测到 GLOBALS 的改写尝试'/*/WP_I18N_GLOBALS_OVERWRITE*/ );

// Variables that shouldn't be unset
$no_unset = array( 'GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix' );

$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, $no_unset ) && isset( $GLOBALS[$k] ) ) {
$GLOBALS[$k] = null;
unset( $GLOBALS[$k] );
}
}
这个函数首先判断register_globals是不是打开了,那么这个是什么用途呢,如果这个变量打开了,则会产生如下效果,可以从url中获取变量值,例如$_GET["var"] = "abc"; 那么打开以后默认$var = "abc"; 明白了吧
看看官方的说明,这个register_global打开了会导致什么问题 :
以下是取自官方的一个例子
// 当用户合法的时候,赋值 $authorized = true
if (authenticated_user()) {
$authorized = true;
}

// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
include "/highly/sensitive/data.php";
}
可能导致在设计者不希望的情况下,改变变量的值,从而绕过安全认证。
if ( isset( $_REQUEST['GLOBALS'] ) )
die( /*WP_I18N_GLOBALS_OVERWRITE*/'检测到 GLOBALS 的改写尝试'/*/WP_I18N_GLOBALS_OVERWRITE*/ );
这段也很有意思,为什么有这一段呢,因为在php4以前,register_globals是默认打开,这本没问题,但是后来有些人滥用,导致很多安全问题,后来,这个开关就设置为默认关闭,上面的函数是为了防止GLOBALS 的改写尝试,$GLOBALS 是一个超级变量,他里面存储了所有的全局变量,包含$_GET这些,只要是不是函数内部的变量,在这个超级变量里面都能够找到(跟register_globals打不打开没什么关系),有兴趣可以var_dump($GLOBALS)看看他内部的构造,如果register_globals这个选项打开,如果我们通过GET auth.php?GLOBALS=1来“注入”,那么$GLOBALS变量内的所有值都会被替换,也就是说,代码里面所有的值都失效了?!这太可怕了,事实上,我使用php5.3.8来测试,这个现象并没有发生,说明php官方其实已经考虑过这个问题了,可能wordpress为了兼容低版本的php而做出的这样的判断。
但是安全起见,还是最好关闭register_globals并且不要使用$GLOBALS,以免出现你想不到的事情。
理解了$GLOBALS和register_globals就能理解这个函数是干嘛的了!
 wordpress有些地方的代码,写的很罗嗦,我想可能是由于历史原因,不停的更新,导致一些代码冗余下来,使得这个系统代码看起来没那么优美,这是没办法的,就像主搜一样,本来设计的想的很好,可是后来不停的更迭,不停的改动,结果到后来,也有很多冗余代码,没办法的事情

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注