LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1181|回复: 5

php中临时取消register_globals

[复制链接]
发表于 2006-6-30 10:50:20 | 显示全部楼层 |阅读模式
最近在使用sablog-x写博客,这是一套开源的blog系统,用php开发的。在使用过程中发现后台管理时一修改其他受限管理员密码就会报权限错误。

经过追查,发现当修改其他管理员信息时,当前用户会切换成那个被修改的受限管理员。进一步追查,发现是session中的adminid被修改了。

原作者在开发这套系统的时候是在register_globals = off的环境下开发的。在修改其他管理员的代码里,作者用到了$adminid这个变量。由于我的虚拟主机环境是register_globals = on的,所以对$adminid这个变量的修改会反映到$_SESSION['adminid'],导致了前面的错误。

register_globals这个配置是不能使用ini_set()函数在运行时修改的。看了php手册,里面有一个邮件为rn214 at cam dot ac dot uk 的网友给了一种解决方法,可以临时取消register_globals对session的绑定:
[php]
<?php
$unset = array_keys($_SESSION);
foreach($unset as $rg_var){
if(isset($$rg_var)){
    unset($$rg_var);
}
}
?>
[/php]

另外rumby328 at yahoo dot com 给出了临时取消register_globals对request和server的绑定的方法:
[php]
<?php
if (@ini_get('register_globals'))
{
  $remove_vars = $_REQUEST + $_SERVER;
  foreach ($remove_vars as $key => $value)
  {
      unset($$key);
  }
}
?>
[/php]

希望对大家有所帮助。:)
发表于 2006-7-7 09:47:08 | 显示全部楼层
默认情况下register_globals是off的吧。个人认为这个东西没有用处
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-7 09:50:18 | 显示全部楼层
edong网的虚拟主机就是on,要不我费劲研究这干嘛
回复 支持 反对

使用道具 举报

发表于 2006-7-7 10:33:39 | 显示全部楼层
如果系统支持目录.htaccess的话,可以写一个.htaccess放上去
内容是
php_flag register_globals off
这样可以把这个目录及支目录下面的php脚本的register_globals关掉
回复 支持 反对

使用道具 举报

发表于 2006-7-7 10:34:54 | 显示全部楼层
不过我推荐你写信给edong,让他关掉这个功能,一了百了,反正也没人什么人用他的,又不安全
回复 支持 反对

使用道具 举报

发表于 2006-7-15 10:57:28 | 显示全部楼层
嗯,开着不安全
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表