![]() |
PHP网络开发详解 之对非传入变量进行赋值的攻击方法 |
在PHP5中,register_globals参数在默认情况下是被设置成关闭状态的,如下所示。 register_globals = Off 但是,如果将该参数设置成打开状态,可以使PHP程序直接通过变量来获得用户通过表单或地址栏参数传入的信息。例如,访 http://localhost/test.php?id=10这个地址,如果参数register_globals设置为On的状态,可以在test.php的PHP代码中通过$id来获取传入的参数值10。这种方法可以为程序的编写带来便利,但却为程序的安全带来了一些隐患。以下代码就存在这方面的漏洞。 <?php session_start(); if($username == 'aaa' && $password == 'bbb') //如果用户名为aaa密码为bbb则表示通过验证 { $auth = 1; } if($auth == 1) //如果通过验证则设置Session { $_SESSION["username"] = "aaa"; die("Logon Successully!"); } ?> <html> <head> <title>Login</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <form name="form1" method="post" action=""> <p>Username: <input name="username" type="text" id="username"> </p> <p>Password: <input name="password" type="password" id="password"> </p> <p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </p> </form> </body> </html> 上面的程序通过获取用户的表单输入来验证用户的身份,但是,由于当前的PHP设置允许用户通过地址栏进行全局变量的赋值,用户可以简单地通过在地址栏传入auth参数来对$auth进行赋值。例如,当前的页面链接 http://127.0.0.1/bugs/test1.php,用户可以通过在地址栏访 http://127.0.0.1/bugs/test1.php?auth=1来跳过登录页面。这一漏洞可以使普通用户很容易地跳过用户身份验证页面,为数据库乃至服务器带来严重的安全隐患。 |