用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5392|回复: 1
收起左侧

[HELP] 移动端session经常失效的问题

[复制链接]
发表于 2014-12-2 13:30:16 | 显示全部楼层 |阅读模式
本帖最后由 pipidoudou 于 2014-12-2 13:42 编辑

是专门为移动端定制的页面,有一个登录页面,登录成功后跳转支付,支付完成再跳转回来。使用CI自带的session保存登录状态和一些用户信息。但现在发现经常有些用户登录完了还是重新回到登录页面,或者完成第三方付款操作后callback返回回来,登录信息又丢失了。
不是必现,但每天都有一些。日志中会出现这样的错误:
ERROR - 2014-09-11 16:25:12 --> The session cookie data did not match what was expected. This could be a possible hacking attempt.
对应的业务日志类似这样:
2014-09-01 13:10:40|||INDEX|60.55.40.75|||||unknown|Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App
leWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 QQ/5.0.0.165
2014-09-01 13:12:04|||LOGIN|60.55.40.75|||||unknown|Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App
leWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 QQ/5.0.0.165
2014-09-01 13:12:04|159xxxxxxxx|李x|LOGIN_SUCCESS|60.55.40.75|||||unknown|Mozilla/5.0 (iPhone; CPU iPhone OS 7
_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 QQ/5.0.0.165
2014-09-01 13:12:04|||LOGIN|60.55.40.75|||||unknown|Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App
leWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 QQ/5.0.0.165


想请教一下,到底有哪些原因会造成这种现象?我一直都没有复现出来,不知道咋解决。看其他帖子的问题我这边都没有对应的问题,包括配置、域名特殊字符等。域名就是裸ip加port。
普通用户使用浏览器也不会去修改cookie设置,而且大多数浏览器已经没有禁用cookie的选项了。
出问题的UA列举:
Mozilla/5.0 (Linux; U; Android 4.2.1; zh-cn; HUAWEI G610-U00 Build/HuaweiG610-U00) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31

Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 QQ/5.0.0.165

Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; vivo X1 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.3 Mobile Safari/533.1 MicroMessenger/5.4.0.50_r797544.480 NetType/WIFI

config配置部分:
$config['sess_cookie_name']             = 'abc_session';
$config['sess_expiration']              = 3600*24*30*3;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']              = 'abcsessions';
$config['sess_match_ip']                = FALSE;
$config['sess_match_useragent'] = FALSE;
$config['sess_time_to_update']  = 300;
session保存数据库,但是发现里面都没有上述出问题的那些UA信息!

login中的部分代码:
$this->session->set_userdata('is_login',true);
$this->session->set_userdata('user_id',$user->id);
$this->session->set_userdata('phone',$user->phone);
$this->session->set_userdata('name',$user->name);
log("LOGIN_SUCCESS");
redirect("action/gopay");



log是打印日志的函数,里面也是通过session获取用户信息打印出来。
$ua = $_SERVER["HTTP_USER_AGENT"];
$ip = $ci->input->ip_address();
$phone = $ci->session->userdata('phone')?$ci->session->userdata('phone'):"";
$name = $ci->session->userdata('name')?$ci->session->userdata('name'):"";


gopay是跳转到付款页面。里面首先判断登录状态,如果未登录,会跳转到登录页面。
if(!$this->session->userdata('is_login')){}

发表于 2014-12-3 09:25:58 | 显示全部楼层
1. 首先,如果你是用的是原生的CI Session,它是基于cookie的,用cookie保存is_login信息是非常不安全的,比直接保存用户名和密码还要危险。
2. 【The session cookie data did not match what was expected. This could be a possible hacking attempt】这个错误是存在CI框架下的 Session.php的第159行,你可以具体看下$hash为啥不对。我猜测是因为CI session默认每5分钟会刷新一次cookie,如果你确定是长时间不操作后出现的。

本版积分规则