register_globals,是php.ini文件里面的一个配置选项,接下来,我们可以通过例程来分析一下,当register_globals = on 与 register_globals = off 的时候,对php语言的一些安全影响。
测试源代码如下:index.html 源代码:<form method="post" action="index.php"><table> <tr> <td>用户名:</td> <td><input name="username" type="text"></td> </tr> <tr> <td>密 码:</td> <td><input name="password" type="password"></td> </tr></table><input type="submit" name="submit" value="登录" class="button"></form>index.php 源代码:<?php //包含配置文件 require_once ('config.inc.php'); //如果用户已经登录提交 if($_POST['submit']) { //用户名$username=ClearSpecialChars($_POST['username']);//密码,需要进行MD5或者sha1加密$password=md5($_POST['password']);//$password=sha1($_POST['password']);//从数据库中检索用户名,密码是否匹配$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";$result = @mysql_query($sql);$num_rows = @mysql_num_rows($result);if($num_rows == 1){ //获得用户名$row = mysql_fetch_assoc($result);//将用户名存入SESSION中$_SESSION['username'] = $row['username'];//跳转到用户权限页面header("Location: main.php");}else{ ExitMessage("用户名或者密码错误!");} }?>1-1:当设置register_globals = off 的时候,index.php源代码可以正常执行(注意:修改php.ini文件之后需要我们重新启动Apache修改方能生效),如图:
输入正确的用户名与密码之后,执行效果如下:
1-2:
当设置register_globals = on 的时候,index.php源代码修改成这样子也可以正常执行(注意:修改php.ini文件之后需要我们重新启动Apache修改方能生效),如图:修改后的php.ini文件如图:
修改后的index.php源代码,执行效果如图:
修改之后的index.php源代码如下:
<?php //包含配置文件 require_once ('config.inc.php'); //如果用户已经登录提交 if($_POST['submit']) { //用户名//$username=ClearSpecialChars($_POST['username']);$username=ClearSpecialChars($username);//密码,需要进行MD5或者sha1加密//$password=md5($_POST['password']);$password=md5($password);//$password=sha1($_POST['password']);//从数据库中检索用户名,密码是否匹配$sql = "SELECT * FROM user WHERE username='$username' AND password='$password'";$result = @mysql_query($sql);$num_rows = @mysql_num_rows($result);if($num_rows == 1){ //获得用户名$row = mysql_fetch_assoc($result);//将用户名存入SESSION中$_SESSION['username'] = $row['username'];//跳转到用户权限页面header("Location: main.php");}else{ ExitMessage("用户名或者密码错误!");} }?>总结: 有关于php版本与register_globals的历史php从>=4.20版本开始,php.ini中register_globals = Off了,php之前的版本register_globals = On 的。php从>=4.20版本开始,使用register_globals = Off 的原因当 register_globals = On,即register_globals 打开以后,各种变量都被注入代码,例如来自 HTML 表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代。但 PHP 社区还是决定默认关闭此选项。当打开时,人们使用变量时确实不知道变量是哪里来的,所以,php社区还是决定选择register_globals = Off的情况,这样,php语言写出来的代码会更安全些。