xoops 2.0.16a 之前版本發生登入成功, 卻還是在登入的問題
這個問題存在已久,
網路上一般都是將session這個table修復,
再不行, 就重新建立這個table…
但…問題並不完全出在此….
官網上有說明是因為php版本的問題…
雖然有釋出修正程式…但是好像沒有效果….
因為這個問題並不是每個人都會遇到..
剛好今天在研究這個問題時…突然就發生了…
趁這個機會來看看到底哪裡出問題
正常狀態下…當瀏覽器開啟xoops的網頁時…
session table會寫入sess_id、sess_updated、sess_ip,
sess_data是空值…
登入後…sess_data才會有資料,
但問題發生, 當瀏覽器開啟xoops的網頁時…
sess_id卻是空值…sess_updated、sess_ip有資料
登入後…sess_id依舊是空值…但sess_data卻有資料…
所以在網頁上才會呈現….感謝您的登入…但實際上卻還是在登入狀態….
因為….sess_id消失了…..
我拿了xoops 2.3.3版的來做比較(xoopscube因為全部改成物件…程式差異太大…無法拿來比較)
檢查了/kernel/session.php /include/checklogin.php /include/common.php
他們都有些許的差異….但問題是出在common.php這裡
x233版…
在237行的Login a user with a valid session註解下
他先將 $sess_handler 宣告成全域變數…
// ############## Login a user with a valid session ##############
$xoopsUser = '';
$xoopsUserIsAdmin = false;
$member_handler =& xoops_gethandler('member');
global $sess_handler;
$sess_handler =& xoops_gethandler('session');
在if ( !is_object($xoopsUser)底下
加了session_destroy();…
利用sess_handler這個全域變數…呼叫他的update_cookie來寫入cookie
再來判斷$_SESSION['xoopsUserGroups']是否存在…
來決定是否寫入或直接讀取Groups….
if ( !is_object($xoopsUser)) ) {
$xoopsUser = '';
$_SESSION = array();
session_destroy();
} else {
$GLOBALS["sess_handler"]->update_cookie();
if (isset($_SESSION['xoopsUserGroups'])) {
$xoopsUser->setGroups($_SESSION['xoopsUserGroups']);
} else {
$_SESSION['xoopsUserGroups'] = $xoopsUser->getGroups();
}
$xoopsUserIsAdmin = $xoopsUser->isAdmin();
}
但最終問題應該是出在sess_handler這個全域變數…
可能原因是….xoops之前版本都是針對舊版php來抓取session
但新版因為安全性的問題…修正了部份對session的處理…
導致這個問題發生….
但很奇妙的是…我發生問題的是IE…
然後用google chromium開…卻抓的到sess_id
不管IE怎麼清除資料….不給抓就是不給抓….
目前改完之後…session table裡是沒有再出現sess_id空的狀況…
我的IE也恢復正常登入….
再持續觀察吧….
尚無回應.