首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

DedeCMS PHP 5.4+ 後台登入空白修復:session_register 移除兼容方案

     編輯:PHP 相關知識

DedeCMS 在 PHP 5.4+ 環境下後台登入顯示空白,根因是 include/userlogin.class.php 使用已被移除的 session_register() 函數。本文提供精確修復方案與代碼對照。

報錯原因

  • PHP 5.4.0 移除 session_register()、session_unregister()、session_is_registered();
  • DedeCMS 舊版本在 keepUser() 方法中大量調用該函數註冊 Session 變量;
  • 調用失敗導致腳本中斷,輸出為空白頁。

修復原則

  1. 直接使用 $_SESSION[$key] = $value 替代 session_register($key);
  2. 判斷是否已註冊改用 isset($_SESSION[$key]);
  3. 保持原有變量名邏輯不變,最小化改動。

精確修改對照(include/userlogin.class.php)

原代碼(約第 120-140 行)

@session_register($this->keepUserIDTag);
$_SESSION[$this->keepUserIDTag] = $this->userID;
@session_register($this->keepUserTypeTag);
$_SESSION[$this->keepUserTypeTag] = $this->userType;
@session_register($this->keepUserChannelTag);
$_SESSION[$this->keepUserChannelTag] = $this->userChannel;
@session_register($this->keepUserNameTag);
$_SESSION[$this->keepUserNameTag] = $this->userName;
@session_register($this->keepUserPurviewTag);
$_SESSION[$this->keepUserPurviewTag] = $this->userPurview;
@session_register($this->keepAdminStyleTag);
$_SESSION[$this->keepAdminStyleTag] = $adminstyle;
PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
PutCookie('DedeLoginTime', time(), 3600 * 24, '/');

修正後代碼

global $admincachefile, $adminstyle;
if (empty($adminstyle)) $adminstyle = 'dedecms';

// 用戶 ID
// @session_register($this->keepUserIDTag);
$_SESSION[$this->keepUserIDTag] = $this->userID;

// 用戶類型
// @session_register($this->keepUserTypeTag);
$_SESSION[$this->keepUserTypeTag] = $this->userType;

// 用戶頻道
// @session_register($this->keepUserChannelTag);
$_SESSION[$this->keepUserChannelTag] = $this->userChannel;

// 用戶名
// @session_register($this->keepUserNameTag);
$_SESSION[$this->keepUserNameTag] = $this->userName;

// 權限
// @session_register($this->keepUserPurviewTag);
$_SESSION[$this->keepUserPurviewTag] = $this->userPurview;

// 後台樣式
// @session_register($this->keepAdminStyleTag);
$_SESSION[$this->keepAdminStyleTag] = $adminstyle;

PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');
PutCookie('DedeLoginTime', time(), 3600 * 24, '/');

關鍵點說明

  1. 刪除所有 @session_register(...) 行,保留賦值語句;
  2. 新增 global $admincachefile, $adminstyle; 確保變量可用(原代碼上下文可能已有,視具體版本);
  3. $adminstyle 兜底賦值 防止未定義;
  4. Cookie 邏輯保持不變,無需調整。

驗證步驟

  1. 修改文件後刷新後台登入頁;
  2. 輸入正確帳號密碼,應能正常進入後台主界面;
  3. 檢查瀏覽器開發者工具 Application → Cookies,確認 DedeUserID、DedeLoginTime 正常寫入;
  4. 關閉瀏覽器重新打開,驗證 Cookie 自動登入功能。

擴展:全站 session_register 清理腳本

若專案較大,可用以下命令快速定位所有調用點:

grep -rn "session_register" --include="*.php" .

逐個按上述模式替換。常見文件還包括:

  • include/common.inc.php(早期版本初始化 Session);
  • member/inc/inc_archives_functions.php(會員中心相關);
  • 各類插件文件。

長期維護建議

  • 升級至 DedeCMS V5.7 SP2+ 官方已修復版本;
  • 或遷移至現代框架(Laravel/ThinkPHP)重構;
  • 若必須維護舊版,鎖定 PHP 5.6 運行環境(安全風險自負)。

這個微小修復能讓老舊 DedeCMS 在現代 PHP 環境繼續運行,為遷移爭取時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved