background image

</FORM>

  这会显示一个文本框和提交按钮。当用户点击提交按钮时,"test.php"会处理用户的输

入,当"test.php"运行时,"$hello"会包含用户在文本框输入的数据。从这里我们应该看出,

攻击者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来调

用"test.php",而是直接在浏览器地址栏输入 http://server/test.php?hello=hi&setup=no,那么,

不止是"$hello"被创建,"$setup"也被创建了。

  下面的用户认证代码暴露了 PHP 的全局变量所导致的安全问题:

<?php

if ($pass == "hello")

$auth = 1;

...

if ($auth == 1)

echo

 

"some

 

important 

information";

?>

  上面的代码首先检查用户的密码是否为"hello",如果匹配的话,设置"$auth"为"1",

即通过认证。之后如果"$suth"为"1"的话,就会显示一些重要信息。

  这段代码假定"$auth"在没有设置值的时候是空的,但是攻击者可以创建任何全局变

量并赋值,通过类似"http://server/test.php?auth=1"的方法,我们完全可以欺骗这段代码,

使它相信我们是已经认证过的。

  因此,为了提高 PHP 程序的安全性,我们不能相信任何没有明确定义的变量。如果