喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 帮助

RSS 订阅当前论坛  

喜悦证交所已经关闭

上一主题 下一主题
 11  1/2  1  2  > 
     
标题: [问题] 引用一段不太明白的CODE,希望大家来关照与探讨一下  
 
pass2936
等待验证会员

初级会员



UID 66486
精华 0
积分 64
帖子 44
金钱 64 喜悦币
威望 0
人脉 0
阅读权限 0
注册 2005-9-8
状态 离线
[广告]: q m
引用一段不太明白的CODE,希望大家来关照与探讨一下

这两行有严重的代码漏洞,没有对提交的变量进行过滤就释放了。
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
....................................................

在以下的代码中用到了$_SERVER数组的变量
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];
$PHP_DOMAIN = $_SERVER['SERVER_NAME'];

我们在提交地址时,可以自己构造$_SERVER数组的变量,比如提交:
http://www.phpcms.com/index.php?_SERVER[SERVER_NAME]=some_string
那么执行@extract($_GET, EXTR_OVERWRITE)后,会生成$_SERVER[SERVER_NAME]=some_string,$PHP_DOMAIN 将不在是程序期望的结果。

没有检测这个漏洞对整个程序有什么影响,但这样肯定不安全。正确的做法是检测提交变量的第一个字母是否是 _,引一段Discuz的代码:

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}


正确的做法是检测提交变量的第一个字母是否是 //尤其是这句话
2008-3-13 09:00 AM#1
查看资料  发短消息  QQ  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 11758
帖子 4930
金钱 11755 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 嘎嘎
我是不喜欢直接extract来自客户端的这些全局变量 而且还overwrite了 等于是把register_global给启动了
与其这么麻烦的再做安全过滤 不如将register_global关闭 直接使用$_GET等变量
我感觉DZ的代码之所以这样写 主要是考虑到服务器端的通用性才做的 因为有可能要运行到虚拟主机上 用户无法调整register_global参数




最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-3-13 09:46 AM#2
查看资料  Blog  发短消息  顶部
 
影子战士
中级会员
Rank: 3Rank: 3


UID 72951
精华 0
积分 263
帖子 221
金钱 263 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2006-5-8
来自 吉林
状态 离线
[推荐阅读] mysql_query("SET NAMES UTF8"); 面向对象的方法应该该怎么写呢?
恩 开源吗? 就是要通用!迎合多种情况!
2008-3-13 09:58 AM#3
查看资料  发短消息  顶部
 
pass2936
等待验证会员

初级会员



UID 66486
精华 0
积分 64
帖子 44
金钱 64 喜悦币
威望 0
人脉 0
阅读权限 0
注册 2005-9-8
状态 离线
[推荐阅读] mysql消除乱码方法集
我有些不解这段是什么意思?

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
2008-3-13 11:09 AM#4
查看资料  发短消息  QQ  顶部
 
songlv (超级版主)
论坛元老
Rank: 8Rank: 8


UID 73828
精华 0
积分 3021
帖子 693
金钱 3017 喜悦币
威望 0
人脉 4
阅读权限 90
注册 2006-5-22
状态 离线
[推荐阅读] 关于php中session_start()的问题
DZ的确有这个写法,鄙人也不赞同,说不定以后不注意 就会有安全问题



不要跑  不要玩   不要看  不要  
2008-3-13 11:32 AM#5
查看资料  访问主页  Blog  发短消息  顶部
 
奶瓶 (NP博士)
版主
Rank: 7Rank: 7Rank: 7
老仙


UID 52707
精华 4
积分 27779
帖子 6466
金钱 27729 喜悦币
威望 50
人脉 0
阅读权限 100
注册 2004-11-22
来自 北大中文系
状态 离线
[推荐阅读] 上传文件如何生成缩略图
我经常extract




图片包子,注册送100包子!
域名抢注
2008-3-13 12:35 PM#6
查看资料  访问主页  Blog  发短消息  QQ  ICQ 状态  Yahoo!  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 11758
帖子 4930
金钱 11755 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 上海地纬新增职位


QUOTE:
原帖由 pass2936 于 2008-3-13 11:09 AM 发表
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
就是把cookie、post、get变量一起处理下 检查他们的键值中有没有开头为下划线的元素 如果不是下划线 就将里面的值用addslashes处理下
这里的addslashes使用了dz自己定义的函数daddslashes来做了 应该是一个可以递归给多元数组使用addslashes的函数




最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-3-13 12:47 PM#7
查看资料  Blog  发短消息  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4863
帖子 1735
金钱 4853 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 数组转换问题
我是extract以后,把get和post删除



在场外支持奥运.....
2008-3-13 06:38 PM#8
查看资料  访问主页  发短消息  QQ  顶部
 
songlv (超级版主)
论坛元老
Rank: 8Rank: 8


UID 73828
精华 0
积分 3021
帖子 693
金钱 3017 喜悦币
威望 0
人脉 4
阅读权限 90
注册 2006-5-22
状态 离线
[推荐阅读] JS里location问题


QUOTE:
原帖由 剑枫 于 2008-3-13 06:38 PM 发表
我是extract以后,把get和post删除
问题是你extract以后 并不是你所有的变量用之前都声明了,别人可能会通过表单构造一些变量而干扰程序正常运行达到某种攻击




不要跑  不要玩   不要看  不要  
2008-3-13 09:24 PM#9
查看资料  访问主页  Blog  发短消息  顶部
 
pass2936
等待验证会员

初级会员



UID 66486
精华 0
积分 64
帖子 44
金钱 64 喜悦币
威望 0
人脉 0
阅读权限 0
注册 2005-9-8
状态 离线
[推荐阅读] 提问:DZ论坛部分用户不能修改头像!!急~!
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
unset($search_arr, $replace_arr);

$magic_quotes_gpc = get_magic_quotes_gpc();
if(!$magic_quotes_gpc)
{
        $_POST = new_addslashes($_POST);
        $_GET = new_addslashes($_GET);
}
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
unset($_POST, $_GET);


这是引用phpcms2007的一段code,不知是否因我理解的原因,总觉这段有些不妥:

@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);

extract按照我的理解是为防止用户把register_globals=off,而做的一操作,所以觉得是否应该在extract这二句的外层加上一个:
if (!get_ini('register_globals')) {
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
}

同时总这一部份代码,从上到下总觉得结构不够严谨,也不知道为什么?????????

[ 本帖最后由 pass2936 于 2008-3-14 09:36 AM 编辑 ]
2008-3-14 08:13 AM#10
查看资料  发短消息  QQ  顶部
 11  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.027809 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP