<?php
// 配置數據庫連接(建議提取到獨立配置文件)
$dbConfig = [
'host' => 'localhost',
'user' => 'root',
'pass' => 'your_secure_password',
'db' => 'cookie_auth'
];
// 處理登入提交
if (isset($_POST['name'], $_POST['pass'])) {
// 驗證輸入
$username = trim($_POST['name']);
$password = $_POST['pass'];
if ($username === '') { die('請輸入用戶名!'); }
if ($password === '') { die('請輸入密碼!'); }
// 使用 mysqli 預處理語句防注入
$mysqli = new mysqli($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['db']);
if ($mysqli->connect_errno) { die("數據庫連接失敗: " . $mysqli->connect_error); }
$stmt = $mysqli->prepare("SELECT id FROM users WHERE name = ? AND pass = SHA1(?)");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows === 1) {
// 登入成功
session_start();
$_SESSION['auth'] = 1;
$_SESSION['user_id'] = $stmt->insert_id; // 或從結果綁定獲取
// Cookie 保存 30 天,設置 HttpOnly、Secure(HTTPS 環境)
setcookie('username', $username, time() + 86400 * 30, '/', '', true, true);
echo "用戶訪問已授權!";
} else {
echo "錯誤的用戶名或密碼!";
}
$stmt->close();
$mysqli->close();
exit;
}
?>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>登入</title></head>
<body>
<form method="post" action="">
用戶名:<input type="text" name="name" value="<?= htmlspecialchars($_COOKIE['username'] ?? '') ?>" /><br>
密碼:<input type="password" name="pass" /><br>
<input type="submit" value="登入" />
</form>
</body>
</html>
mysqli 或 PDO,並採用預處理語句防 SQL 注入。password_hash() + password_verify()(BCrypt/Argon2)。HttpOnly 防 XSS 竊取,Secure 僅 HTTPS 傳輸,SameSite 防 CSRF。htmlspecialchars() 防 XSS。session_regenerate_id(true)。若需長期自動登入,勿直接存密碼或簡單 Hash。推薦:
1. 生成隨機 selector + validator 雙 Token。
2. 數據庫存 selector、hash(validator)、過期時間、用戶 ID。
3. Cookie 存 selector:validator(Base64 編碼)。
4. 驗證時查 selector,驗證 hash(validator),通過後重新生成雙 Token(輪換機制)。