解決ecshop登錄自動退出的莫名現象

  最近在作ecshop的二次開發,程序發佈後測試出現一個莫名的問題。點擊幾回頁面後出現session丟失,須要重複登錄;本地怎麼測試也都沒法重現問題。一開始覺得是修改程序的問題,但是怎麼找都找不着問題所在。網上搜索了一下,說是ip發生了變化引發的。因而作了以下測試:php

  一、www.ip.cn查詢並記錄下IP安全

  二、登錄session

  三、隨機點擊網頁,直到要求從新登錄函數

  四、www.ip.cn從新查下IP測試

  果真先後兩個IP不同。於是頗有多是因爲IP發生變化致使session失效,因而查看了下ecshop的session機制。其中獲取session key的函數是這樣網站

  includes/cls_session.php(移動端的也相似:mobile/include/cls_session.php)this

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段的部分去掉,因而修改後的函數也就成這樣了。spa

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這一步的判斷也就失效了。這也進一步下降了網站的安全性,這中間怎麼取捨也就見仁見智了。code

相關文章
相關標籤/搜索