與註冊頁類似,但新增 LOGIN 常量與 $InLogin 變量:
define('INSIDE', true);
define('INSTALL', false);
define('LOGIN', true);
$InLogin = true;
$xnova_root_path = './';
include($xnova_root_path . 'extension.inc');
include($xnova_root_path . 'common.' . $phpEx);
includeLang('login');
LOGIN:標識登錄流程,影響 common.php 中的用戶檢查邏輯$InLogin = true:告知公共代碼跳過自動登錄檢查$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);
$parse['last_user'] = $LastPlayer['username'];
// 線上玩家數(15分鐘內活躍)
$PlayersOnline = doquery("SELECT COUNT(DISTINCT(id)) as `onlinenow` FROM {{table}} WHERE `onlinetime` > '" . (time()-900) ."';", 'users', true);
$parse['online_users'] = $PlayersOnline['onlinenow'];
$parse['users_amount'] = $Count['players'];
$parse['servername'] = $game_config['game_name'];
$parse['forum_url'] = $game_config['forum_url'];
$parse['PasswordLost'] = $lang['PasswordLost'];
$page = parsetemplate(gettemplate('login_body'), $parse);
// API 介面:獲取在線/總人數統計
if ($_GET['ucount'] == 1) {
$page = $PlayersOnline['onlinenow'] . "/" . $Count['players'];
die($page);
} else {
display($page, $lang['Login']);
}
game_users 獲取記錄md5($input_password) === $db_passwordinclude config.phpheader('location: frames.php') 進入遊戲主界面失敗分支調用 message() 輸出錯誤提示(用戶不存在、密碼錯誤、帳號被封禁等)。
典型設置:
setcookie('user', $username, time() + 31536000); // 1年
setcookie('pass', $password_hash, time() + 31536000);
當 $InLogin != true 時(即非登錄頁),執行:
$Result = CheckTheUser($IsUserChecked); $IsUserChecked = $Result['state']; $user = $Result['record'];
CheckTheUser() → CheckCookies()(定義於 includes/functions/CheckCookies.php)解析 Cookie、驗證密碼哈希、查詢用戶表、返回用戶數據陣列。
if ($InLogin == false) {
if ($game_config['game_disable']) {
if ($user['authlevel'] < 1) {
message(stripslashes($game_config['close_reason']), $game_config['game_name']);
}
}
}
管理員(authlevel >= 1)維護期間仍可登錄,普通玩家見到維護公告。
| 問題 | 風險 | 建議方案 |
|---|---|---|
| MD5 密碼哈希 | 彩虹表攻擊、碰撞風險 | 遷移至 password_hash() / Argon2id |
| Cookie 存儲密碼哈希 | XSS 竊取後可離線破解 | 改用 Session + HttpOnly Cookie,或 JWT |
| 無 CSRF 保護 | 登錄表單可被偽造提交 | 增加 CSRF Token 驗證 |
| 無暴力破解防護 | 帳號枚舉、密碼噴灑攻擊 | 限制登錄頻率、CAPTCHA、帳號鎖定 |
| SQL 拼接查詢 | 注入風險 | 全面採用 Prepared Statements |