它的代码里有这样一段:
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) { $_key{0} != '_' && $$_key = daddslashes($_value);//daddslashes递归转义关键字符,类似addslashes
}
}
这样的话就是按GPC的优先次序,模拟了register_globals = On。
比如$_COOKIE['test']=value1 会在处理页面转成$test=value1,并且会被$_GET['test']=value2覆盖。
很难理解它为何要这样做。太不安全了。只要一不小心,就会有可能利用url后缀 ?test=xxx之类来改变设定值啊!

解决方案 »

  1.   

    foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
        foreach($$_request as $_key => $_value) {
            $_key{0} != '_' && $$_key = daddslashes($_value);
        }
    }
    //$_key{0} != '_' //DZ里,一般带_前缀的都是系统比较重要的,不会这样处理。
    cookie的值也是dcookie来获得的。
    个人觉得应该加个isset($$_key),更改下优先次序
      

  2.   

    既然是按照GPC,那么P会覆盖G,C会覆盖P或G
    如果从URL构建恶意攻击参数,会被同名的、真正从页面发送过来的P和C所覆盖。
      

  3.   

    同意楼上的。应该加个isset判断下。
    这是最新版7.2的写法。
    关键是他为何还要模拟个register_globals = On
    php老早就因为这样不安全建议抛弃$_REQUEST[]之类的用法,并且register_globals默认都是off的。。
    感觉它的写法好奇怪
    另外它还有个dhtmlspecialchars方法,类似于htmlspecialchars,编码特殊字符防xss,//将&"<>过滤,同时放过&#+(3到5位数字)或&#x+(4位16进制的数字)格式的编码如&#100
    //【暂时不清楚为何要如此?完全可以利用这个对html编码放行的设定而进行xss攻击】
    function dhtmlspecialchars($string) {
    if(is_array($string)) {
    foreach($string as $key => $val) {
    $string[$key] = dhtmlspecialchars($val);
    }
    } else {
    $string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1',
    //$string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/', '&\\1',
    str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string));
    }
    return $string;
    }
      

  4.   

    你仔细看看,按它的写法,是GPC优先级从高到低。
      

  5.   

    你太深入了这一步不是数据合法性验证,而是为了转义,防止SQL注入数据覆盖,或者有人随手把某个URL的参数改了【这很可能吧】,相当于给了一个新的值但这没关系对于具体的某个业务操作来说,要不要限定参数的合法范围,应该放在后面具体的地方判断
      

  6.   

    discuz很早前就有了吧,原来应该是在PHP旧版本基础上写的,可能有什么需要,然后它新版本考虑到向前的兼容性所以就没有删除这些了。以上纯属猜测
      

  7.   

    嗯,安装的时候居然要开启short tag。
      

  8.   

    这里只是对  GPC 进行转义过滤之类的吧。
      

  9.   

    主要是为程序员偷懒,才编写了这个函数,这样不要手动去接受$_POST, $_GET等,$_key{0} != '_' 这个可能是为了一些重要的数据不调用这个方法接受,采用手动接受
      

  10.   

    也不能算偷懒,根据get_magic_quotes_gpc,是否转义,是必要的