金金 |
2009-03-22 11:48 |
先看这一段简单的代码 <?php session_start();
$_SESSION['isadmin']='yes';
$isadmin='no';
echo $_SESSION['isadmin'];
?> 当php.ini里配置 register_globals = Off 时, 没任何问题, 输出 yes
但是 当php.ini里配置 register_globals = On 的时候, 第一次运行输出 yes 而刷新一下,则显示的是 no
显然这是不正常的, 这是个很奇怪的问题, 如果说是 $isadmin='no'; 改变了SESSION, 那么为什么第一次会显示yes呢?
都知道:当配置 register_globals = On 的时候, 通过 xxx.php?id=123 访问时,程序会自动创建变量 id 那么自动创建的变量会不会改变SESSION呢? 测试代码 <?php //xxx.php session_start(); echo $_SESSION['id']; ?> 通过 xxx.php?id=123 访问,没任何输出, 还好,不然不知道将有多少 采用 SESSION 做登录的 而PHP配置 register_globals 为 On 的网站 将被随便登录。
还有两个常用的函数 import_request_variables() 和 extract() import_request_variables -- 将 GET/POST/Cookie 变量导入到全局作用域中 extract -- 从数组中将变量导入到当前的符号表 <?php //xxx.php
import_request_variables('G'); echo $id;
?> 当通过xxx.php?id=123访问的时候, 就算 register_globals 设为 Off 也是会输出123
extract($_GET) 与 import_request_variables('G') 功能相似
那么试试import_request_variables() 与 extract()创建的变量会不会影响SESSION呢? 测试代码 <?php //xxx.php session_start();
import_request_variables('G');
echo $_SESSION['id']; ?> 当通过xxx.php?id=123访问程序, 没有输出,再用extract($_GET)代替import_request_variables('G')测试, 还是没输出,这一点又很奇怪了,因为测试 <?php session_start(); $arr=array('id'=>123); extract($arr); echo $_SESSION['id']; ?> register_globals 为 On 时 会输出 123
看来同样是数组, extract 处理 $_GET 与处理定义的数组 用的是不一样的方法。
结论: register_globals 为 On 的时候, 用import_request_variables('G')和extract($_GET)创建的变量是不会改变SESSION的。
总结:漏洞只存在于PHP配置register_globals = On的时候,定义的变量会改变同名的SESSION。
作者:Cos.X
|
|