解決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這一步的判斷也就失效了。這也進一步降低了網站的安全性,這中間怎么取舍也就見仁見智了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM