[原创]Codeigniter 3.2.0-dev 中的一个SESSION异常问题


代码版本:3.2.0-dev  (不建议使用DEV版本)

问题现象:同一套代码,在服务器上可以正常使用。在本地开发环境中无法正常登陆。

环境配置:

            windows 10  /  php 7.1.4  / Codeigniter 3.2.0

问题概述

在碰到这个问题的时候,仔细核查了所有代码。首先确定代码没有明显的错误(因为线上可以正常使用)。

中间的曲折就不多说了,后面跟进分析HTTP请求。发现每次请求的session_name都会被更新。意味着服务器每次都会重新生产一个SID给客户端。至此发现问题症状

问题处理

Setup 1.

    检查php 配置相关。主要是 save_path ,以及 timezone 区段。验证无果

Setup 2. 

    追踪代码

               验证单文件请求session_id是不会变动的。因此确定问题就是处在代码上。二话不说,直接搜到session_start(); 位置,增加断点,输出SID ;  

           SID 还是变动 。。。 不断追。最后发现问题处在

if (isset ( $_COOKIE [$this->_config ['cookie_name']] ) && (! is_string ( $_COOKIE [$this->_config ['cookie_name']] ) or ! preg_match ( '/^[0-9a-f]{40}$/', $_COOKIE [$this->_config ['cookie_name']] ))) {
	unset ( $_COOKIE [$this->_config ['cookie_name']] );
}

对判断数据进行验证,以及对服务器的请求也进行验证。发现问题症结(我以`session_name`替代$this->_config['cookie_name'])

$_COOKIE[`session_name`]  

     这个数据,在WIN下取值长度为 32位,在linux下生成的是40位。至此就没继续追究为什么长度不一致的问题了。

    直接杀到官方项目代码库(github)。发现主干代码已经变动,且变动算是不小吧。放弃提交issue,进入本地进行代码修正。

    懒人处理方式:直接把判断长度判断给干掉了

if (isset ( $_COOKIE [$this->_config ['cookie_name']] ) && (! is_string ( $_COOKIE [$this->_config ['cookie_name']] ))) {
	unset ( $_COOKIE [$this->_config ['cookie_name']] );
}

至此SESSION问题解决。一切正常


后话:

         从代码中可以看到,CI的主旨目的是为了进行过滤下COOKIE的数据,按照规范进行数据清洗。如果不符合规范则直接删除COOKIE,就是因为这个清洗规则。。导致每次提交的时候本地的COOKIE其实是已经被删除了的。因此后续提交的时候SID就没有了,每次请求都是一次全新的请求。

        虽然说处理的方式不够严谨,但从未来不可预测角度来说。这么具体的限制了长度。个人觉得未来还会给自己送到坑里。所以果断的给删除长度判断。

很久没写这类文章了。还是习惯性的在我自己的文章中增加我的属性~  sports98<sports98@gmail.com>欢迎各位有兴趣的一起讨论。可以加扣扣群:47217700(PHP策进会-PEA北京)很老的一个群了,原本康盛没被收之前做的一个社区活动群。目前仅为技术讨论交流。进群请告诉我: 1+2+3=?  这个暗号记好了哈~:)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值