Fork me on GitHub

解决ecshop登陆自动退出的莫名现象

  最近在做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这一步的判断也就失效了。这也进一步降低了网站的安全性,这中间怎么取舍也就见仁见智了。

posted @   秋楓  阅读(2271)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示