<?php
define('INSIDE', true); // 防止直接存取核心檔案
define('INSTALL', false); // 非安裝模式
define('LOGIN', true); // 登入頁面標識
$InLogin = true; // 模板判斷用
<?php
$xnova_root_path = './';
include($xnova_root_path . 'extension.inc');
include($xnova_root_path . 'common.' . $phpEx);
includeLang('login'); // 載入 login.mo
<?php
$parse = $lang;
$Count = doquery('SELECT COUNT(*) as players FROM {{table}} WHERE 1', 'users', true);
$LastPlayer = doquery('SELECT username FROM {{table}} ORDER BY register_time DESC', 'users', true);
$PlayersOnline = doquery("SELECT COUNT(DISTINCT id) as onlinenow FROM {{table}} WHERE onlinetime > " . (time()-900), 'users', true);
$parse['last_user'] = $LastPlayer['username'];
$parse['online_users'] = $PlayersOnline['onlinenow'];
$parse['users_amount'] = $Count['players'];
$parse['servername'] = $game_config['game_name'];
$parse['forum_url'] = $game_config['forum_url'];
$page = parsetemplate(gettemplate('login_body'), $parse);
// API 模式:僅回傳線上/總人數
if ($_GET['ucount'] == 1) {
die($PlayersOnline['onlinenow'] . "/" . $Count['players']);
} else {
display($page, $lang['Login']);
}
users 表md5() 驗證密碼configsetcookie() 寫入用戶名、密碼雜湊header('Location: frames.php') 重導向遊戲主介面message() 顯示錯誤並終止message() 功能類似 display() 但用於錯誤/資訊頁面| 原版做法 | 風險 | 現代建議 |
|---|---|---|
md5() 單向雜湊 | 極易碰撞、彩虹表破解 | password_hash() + password_verify() (bcrypt/argon2) |
| Cookie 存密碼雜湊 | 竊取即可偽造登入 | Session + HttpOnly Cookie / JWT / Remember Token |
| 無 CSRF 保護 | 跨站請求偽造 | 表單 Token / SameSite Cookie |
md5 無鹽值 | 相同密碼產生相同雜湊 | bcrypt 內建鹽值、成本因子可調 |
若維護 Xnova 類專案,優先重構認證系統:
password 欄位存 bcrypt 雜湊password_verify()session_regenerate_id(true) 防 Session Fixationselector/validator、Cookie 存雙 Token