当key中含有"."号时,session方法存在Bug

浏览:619 发布日期:2014/12/18
3.2.2 - 严重 - 已处理
如题。
我在分析onethink源码时,看到使用了session方法来存储菜单。使用如下:session('ADMIN_MENU_LIST.User',$menus); //注意这里的key有一个"."(句号)使用上面方法存储session以后,那么下面我取出来,代码如下:$menus  =   session('ADMIN_MENU_LIST.User');好了,$menus值始终为NULL,没有任何值。实际上session已经存储了,从打印$_SESSION是可以看到的。

打印结果如下:[ADMIN_MENU_LIST.User] => Array(
    [main] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [title] => 首页
                    [url] => Index/index
                )
            [1] => Array
                (
                    [id] => 2
                    [title] => 内容
                    [url] => Article/index
                )

        )
)
不过问题是,取不了值。 从session()方法的源码中,在使用session设置值时,代码如下:     // 设置session
        if($prefix){
            if (!isset($_SESSION[$prefix])) {
                $_SESSION[$prefix] = array();
            }
            $_SESSION[$prefix][$name]   =  $value;
        }else{
            $_SESSION[$name]  =  $value;
        }
    }
如果使用session方法获取值时,代码如下:if($prefix){ // 获取session
    if(strpos($name,'.')){
        list($name1,$name2) =   explode('.',$name);
        return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;  
    }else{
        return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;                
    }            
    }else{
    if(strpos($name,'.')){
        list($name1,$name2) =   explode('.',$name);
        return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;  
    }else{
        return isset($_SESSION[$name])?$_SESSION[$name]:null;
    }            
}
注明:上面只是session方法中的片段。

为什么通过 session('ADMIN_MENU_LIST.User'); 获取不了值,原因是,session方法把key值变成了这样获取$_SESSION['ADMIN_MENU_LIST']['User'] ,这样子当然没法获取。
这样才能获取啊亲:$_SESSION['ADMIN_MENU_LIST.User']



从分析中,可以看到,这里会有问题,就是session(key,value)在设置值时,它不管key中是否有"."(句号),直接把它看做一个字符串,不做任何处理。

但是,如果在使用session(key)来获取值时,如果key中有“.”(句号),那么就会把“.”号的前后分割为key1、key2,把它当成二维数组了。

这样处理当然会取不出值,由于手册上并没有对session方法中是否可以使用“.”号作说明。

但是不管有没有说明吧,这种处理方法本身就存在不合理性,希望能够解释一下,谢谢。

支持ThinkPHP。
评论(
后面还有条评论,点击查看>>