博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决ecshop登陆自动退出的莫名现象
阅读量:7056 次
发布时间:2019-06-28

本文共 1066 字,大约阅读时间需要 3 分钟。

  最近在做ecshop的二次开发,程序发布后测试出现一个莫名的问题。点击几次页面后出现session丢失,需要重复登陆;本地怎么测试也都无法重现问题。一开始以为是修改程序的问题,可是怎么找都找不着问题所在。网上搜索了一下,说是ip发生了变化引起的。于是做了如下测试:

  1、www.ip.cn查询并记录下IP

  2、登陆

  3、随机点击网页,直到要求重新登陆

  4、www.ip.cn重新查下IP

  果然前后两个IP不一样。因而很有可能是由于IP发生变化导致session失效,于是查看了下ecshop的session机制。其中获取session key的函数是这样

  includes/cls_session.php(移动端的也类似:mobile/include/cls_session.php)

function gen_session_key($session_id){  static $ip = '';  if ($ip == '')  {    $ip = substr($this->_ip, 0, strrpos($this->_ip, '.'));  }  return sprintf('%08x', crc32(ROOT_PATH . $ip . $session_id));}

  当IP发生变化时:substr($this->_ip, 0, strrpos($this->_ip, '.'))获取到的IP段,只要不在同一个IP段内便无法获得相同的session key;进而也就无法获得session的具体信息,也就导致重复登陆。这也是为什么本地无法重现问题的原因。好吧,问题找到了。那么怎么解决呢?最简单的办法就是将获取IP段的部分去掉,于是修改后的函数也就成这样了。

function gen_session_key($session_id){    static $ip = '';  /*    if ($ip == '')    {        $ip = substr($this->_ip, 0, strrpos($this->_ip, '.'));    }   */    return sprintf('%08x', crc32(ROOT_PATH . $ip . $session_id));}

  这样便可解决重复登陆的问题。但这又涉及到程序的安全性问题,一旦session泄露IP这一步的判断也就失效了。这也进一步降低了网站的安全性,这中间怎么取舍也就见仁见智了。

转载地址:http://dygol.baihongyu.com/

你可能感兴趣的文章
oracle常用查询三
查看>>
码字定式之SQL(6)
查看>>
命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)...
查看>>
【转】Scheme 编程环境的设置
查看>>
异常分类,异常抛出位置
查看>>
需求分析与原型设计
查看>>
敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
查看>>
代码赏析——史丰收速算
查看>>
oracle恢复误删除表
查看>>
Navicat for MySQL常见命令
查看>>
Threading and Tasks in Chrome
查看>>
七、Maven依赖管理
查看>>
Android 学习
查看>>
工厂模式
查看>>
spring中的web上下文,spring上下文,springmvc上下文区别(超详细)(转载)
查看>>
RxSwift 对 MJRefresh 使用的封装
查看>>
leetcode 118 Pascal's Triangle
查看>>
聚美第八天
查看>>
Java基础-使用Idea进行远程调试
查看>>
Jenkins发送邮件
查看>>