最近在作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