最近,在阅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有些地方的代码,写的很罗嗦,我想可能是由于历史原因,不停的更新,导致一些代码冗余下来,使得这个系统代码看起来没那么优美,这是没办法的,就像主搜一样,本来设计的想的很好,可是后来不停的更迭,不停的改动,结果到后来,也有很多冗余代码,没办法的事情