用戶勾選「記住我」登錄成功後,將用戶名與加密密碼存入 Cookie(有效期如 1 年)。後續訪問時,若 Session 為空但 Cookie 存在,自動驗證並重建 Session,實現免登錄。
function checklogin() {
if (empty($_SESSION['user_info'])) {
if (empty($_COOKIE['username']) || empty($_COOKIE['password'])) {
header("location:login.php?req_url=" . $_SERVER['REQUEST_URI']);
} else {
$user = getUserInfo($_COOKIE['username'], $_COOKIE['password']);
if (empty($user)) {
header("location:login.php?req_url=" . $_SERVER['REQUEST_URI']);
} else {
$_SESSION['user_info'] = $user;
}
}
}
}
$username = trim($_POST['username']);
$password = md5(trim($_POST['password']));
$validatecode = $_POST['validateCode'];
$ref_url = $_GET['req_url'];
$remember = $_POST['remember'];
$err_msg = '';
if ($validatecode != $_SESSION['checksum']) $err_msg = "驗證碼不正確";
elseif ($username == '' || $password == '') $err_msg = "用戶名和密碼都不能為空";
else {
$row = getUserInfo($username, $password);
if (empty($row)) $err_msg = "用戶名和密碼不正確";
else {
$_SESSION['user_info'] = $row;
if (!empty($remember)) {
setcookie("username", $username, time() + 3600*24*365);
setcookie("password", $password, time() + 3600*24*365);
}
header("location:" . (strpos($ref_url, "login.php") === false ? $ref_url : "main_user.php"));
}
}
function logout() {
unset($_SESSION['user_info']);
if (!empty($_COOKIE['username']) || !empty($_COOKIE['password'])) {
setcookie("username", null, time() - 3600*24*365);
setcookie("password", null, time() - 3600*24*365);
}
}
<?php
if ($_COOKIE['uname']) $CKUNAME = $_COOKIE['uname'];
if ($_COOKIE['pwd']) $CKPWD = $_COOKIE['pwd'];
?>
<form method="post">
<input name="uname" value="<?=$CKUNAME?>" />
<input type="password" name="pwd" value="<?=$CKPWD?>" />
<input type="checkbox" name="remember" value="1" <?= $CKUNAME?'checked':''?> /> 記住我
<input type="submit" name="button" value="登錄" />
</form>
<?php
if ($_POST['button']) {
$uname = $_POST['uname'];
$pwd = $_POST['pwd'];
if ($pwd != $CKPWD) $pwd = md5($pwd);
if ($_POST['remember'] == 1) {
setcookie("uname", $uname, time()+3600*24*30);
setcookie("pwd", $pwd, time()+3600*24*30);
}
}
?>
md5 或更強的 bcrypt/argon2),切勿明文。HttpOnly、Secure、SameSite 屬性保護 Cookie。