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也恢復正常登入….
再持續觀察吧….

[相關文章]

  1. 尚無回應.

  1. 尚無引用.