首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實現「記住我」自動登錄:Cookie 與 Session 協同方案詳解

     編輯:PHP 綜合知識

核心邏輯

用戶勾選「記住我」登錄成功後,將用戶名與加密密碼存入 Cookie(有效期如 1 年)。後續訪問時,若 Session 為空但 Cookie 存在,自動驗證並重建 Session,實現免登錄。

四步驟代碼實現

1. 檢查登錄狀態

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;
            }
        }
    }
}

2. 處理登錄提交

$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"));
    }
}

3. 登出清理

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);
    }
}

4. 精簡版範例(單文件演示)

<?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);
    }
}
?>

安全性提醒

  • Cookie 中存儲密碼必須加密(如 md5 或更強的 bcrypt/argon2),切勿明文。
  • 生產環境建議改用「記住我 Token」機制:登錄後生成隨機 Token 存入資料庫與 Cookie,驗證時比對 Token 並可撤銷,避免密碼等價物長期暴露。
  • 啟用 HttpOnly、Secure、SameSite 屬性保護 Cookie。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved