变量覆盖率常被恶意攻击者用来跳过正常的业务逻辑,绕过权限限制,对系统进行恶意攻击,严重时会导致系统瘫痪。1.全局变量覆盖当启用register_globals全局变量设置时,传递的值会直接注册为全局变量直接使用,会造成全局变量覆盖。如果通过$GLOBALS从浏览器动态获取变量,也可能发生变量覆盖。为了便于理解,举一个配置全局变量的例子进行介绍。通过$GLOBALS获取浏览器提交的变量。$value){$GLOBALS[$param]=>$value;//使用$GLOBALS引起变量覆盖}if(authenticated_user()){//认证用户登录$authorized=true;}攻击者在请求中构造authorized=true,可以直接将authorized的值设置为true,无需对用户名和密码进行认证,从而跳过认证,进入登录状态。为避免全局变量覆盖的发生,开发者不要使用上述方法从客户端接收动态变量并放入全局$GLOBALS中。下面是固定代码。当用户提交的参数中包含authorized=true时,在执行authenticated_user()步骤之前,extract()函数从$_REQUEST解析authorized,并设置全局变量,设置全局变量的值为真。此时用户可以不通过验证直接向下执行,绕过验证逻辑,造成任意越权访问。为了避免全局变量覆盖,尽量不要使用extract()函数接收客户端参数。下面是固定代码。当用户提交的参数包含authorized=true时,在执行authenticated_user()步骤之前,import_request_variables解析GET或POST中包含的authorized参数并设置为true。此时用户可以不通过验证直接向下执行,绕过验证逻辑,造成任意越权访问。为避免全局变量覆盖的发生,应尽量不要使用上述方法接收客户端参数。下面是固定代码。在不指定输出变量的情况下,极易出现变量覆盖,影响正常业务逻辑,比如下面的形式。当用户提交参数时,在POST中直接提交authorized=true时,parse_str()函数解析POST中的authorized,将其值设置为true。这时可以将authorized的值设置为true而不执行if条件的内部语句,跳过用户验证逻辑,造成任意登录。为了避免全局变量覆盖的发生,尽量使用指定输出变量的方式。下面是固定代码。