转自php官方文档
举例
<?php
// 当用户合法的时候,赋值 $authorized = true
if (authenticated_user()) {
$authorized = true;
}
// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
如果没有提前定义authorized变量,并且register_globals配置已经是打开的状态,这个安全认证可以被任意绕过。
解决方案
在代码开始前,定义
$authorized = false;
这样就可以避免此类问题。
Warning 本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。
关于register_globals
当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML 表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。
简单理解下。
在你的代码中存在一个变量$test,这个变量并没有赋值,然后以其他的方式(比如get请求,session,header等)提前给这个变量赋值。
如果这个开关开启,即允许全局初始化变量,赋值操作成功;
如果这个开关关闭,即不允许全局初始化变量,赋值操作失败。
基本见解,详情见php官方文档