用戶登入成功後,將加密後的用戶識別資訊寫入 Cookie,實現「記住我」或自動登入功能。
function loginCookie($uid, $name, $group, $ip, $time) {
global $site_domain, $login_key; // 須在配置文件定義
// 統一 Cookie 域:去除 www. 前綴,加前導點支援子域
$domain = (substr($site_domain, 0, 4) === "www.")
? substr($site_domain, 3)
: "." . $site_domain;
// 核心資料加密:UID|姓名|群組|IP,防竄改
$secure = Xxtea::encrypt("{$uid}|{$name}|{$group}|{$ip}", $login_key);
// 過期時間:當前時間 + 86400 秒(1 天)
$expire = $time + 86400;
setcookie("userId", $uid, $expire, "/", $domain);
setcookie("userName", $name, $expire, "/", $domain);
setcookie("userGroup",$group, $expire, "/", $domain);
setcookie("userSecure",$secure, $expire, "/", $domain);
}
.example.com 允許所有子域讀取;去除 www. 避免 www.example.com 與 example.com 互不相容。$login_key 必須機密、定期輪換。防止用戶偽造 Cookie 提權。/:全站有效。setcookie(..., true, true)(PHP 5.2+ 第 6/7 參數),防 XSS 竊取、強制 HTTPS 傳輸。function checkLoginCookie() {
global $login_key;
$uid = $_COOKIE['userId'] ?? '';
$name = $_COOKIE['userName'] ?? '';
$group = $_COOKIE['userGroup'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'];
$secure = $_COOKIE['userSecure'] ?? '';
if (!$uid || !$secure) return false;
$expected = Xxtea::encrypt("{$uid}|{$name}|{$group}|{$ip}", $login_key);
// 使用 hash_equals 防時序攻擊
return hash_equals($expected, $secure);
}
SameSite=Lax 或 Strict 防禦 CSRF。