<?php
// 1. 初始化 Session
if (!isset($_SESSION)) {
session_start();
}
// 2. 引入你的資料庫連線檔 (假設變數名稱為 $pdo)
// require_once('Connections/your_db_connection.php');
if ((isset($_GET['doLogout'])) && ($_GET['doLogout'] == "true")) {
// --- [修正重點 A] 刪除資料庫中的 Remember Me Token ---
if (!empty($_COOKIE['remember_me'])) {
$parts = explode(':', $_COOKIE['remember_me']);
if (count($parts) === 2) {
$selector = $parts[0];
// 執行刪除 (請根據你的資料庫結構調整)
try {
$stmt = $pdo->prepare("DELETE FROM user_tokens WHERE selector = ?");
$stmt->execute([$selector]);
} catch (Exception $e) {
// 靜默失敗,不影響登出流程
}
}
}
// --- [修正重點 B] 清除 Session 變數 ---
$_SESSION = array(); // 直接將 Session 陣列清空是最徹底的做法
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy(); // 銷毀 Session
// --- [修正重點 C] 清除所有相關 Cookie ---
$past = time() - 3600;
// 清除舊有的欄位 (原本你存放在 Cookie 的敏感資料)
setcookie('MM_Username', '', $past, '/');
setcookie('MM_UserCname', '', $past, '/');
setcookie('MM_UserGroup', '', $past, '/');
setcookie('MM_UserGroupName', '', $past, '/');
// 清除新的 Remember Me 安全 Token
setcookie('remember_me', '', $past, '/', '', true, true);
// 3. 導向首頁
$logoutGoTo = "index.php";
header("Location: $logoutGoTo");
exit;
}
?>
- 資料庫連動刪除:安全機制的重點在於「Token 一次性」。當使用者主動點擊登出時,必須從資料庫
user_tokens表中將該selector刪除,讓原本的 Cookie 徹底失效,防止他人盜用。 - 徹底銷毀 Session:原程式逐個
unset較為繁瑣,使用$_SESSION = array()配合session_destroy()是目前更標準的寫法。 - 安全性 Cookie 設定:
- 在刪除
remember_meCookie 時,建議帶上與當初發送時相同的參數(如/路徑)。 - 提醒:既然你已經要實作安全的
remember_me流程,建議不要再把MM_Username(帳號)或MM_UserGroup(權限)存進 Cookie 了,因為 Cookie 是可以被使用者隨意修改的,這會造成安全漏洞。
- 在刪除