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

PHP 利用 Cookie 實現「記住用戶名」登錄功能完整實例

     編輯:PHP 相關知識

PHP 利用 Cookie 實現「記住用戶名」登錄功能完整實例

「記住用戶名」是提升用戶體驗的常見功能:用戶勾選後,下次訪問登錄頁時用戶名自動填入,僅需輸入密碼。本文通過完整的 login.php 與 admin.php 兩文件協作,演示如何使用 PHP 原生 Cookie 實現此功能,並說明關鍵安全細節。

功能流程圖解

  1. 用戶訪問 login.php → 檢查 Cookie 中是否存在 username → 有則自動填入輸入框
  2. 用戶輸入帳密、勾選「記住用戶名」 → 提交至 admin.php
  3. admin.php 驗證帳密 → 成功則根據勾選狀態:
      ✓ 勾選:設定 Cookie 過期時間為 30 天
      ✗ 未勾選:刪除 Cookie(設為過期)
  4. 登錄失敗顯示錯誤並提供返回鏈接

核心代碼實現

1. 登錄頁面 — login.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>用戶登錄</title>
</head>
<body>
<?php
/**
 * 從 Cookie 獲取已保存的用戶名
 * @return string 用戶名或空字符串
 */
function getCookieUsername(): string {
    return $_COOKIE['username'] ?? '';
}
?>

<form action="admin.php" method="post">
    <label>用戶名:
        <input type="text" name="username" value="<?php echo htmlspecialchars(getCookieUsername()); ?>">
    </label><br>
    <label>密碼:
        <input type="password" name="pwd">
    </label><br>
    <label>
        <input type="checkbox" name="yes" value="1"> 是否保存用戶名
    </label><br>
    <input type="submit" name="sub" value="登錄">
</form>
</body>
</html>

關鍵點:使用 htmlspecialchars() 防止 XSS 攻擊;?? 空合併運算符簡化判斷邏輯。

2. 驗證處理 — admin.php

<?php
// 僅演示邏輯,實際項目請使用預處理語句防止 SQL 注入
if (!empty($_POST['sub']) && $_POST['username'] === 'admin') {
    echo "歡迎 " . htmlspecialchars($_POST['username']) . " 登錄成功<br>";

    if (!empty($_POST['yes'])) {
        // 保存 30 天:time() + 3600*24*30
        setcookie('username', $_POST['username'], time() + 2592000, '/', '', false, true);
    } else {
        // 刪除 Cookie:設為過去時間
        setcookie('username', '', time() - 3600, '/', '', false, true);
    }
} else {
    echo "賬號錯誤,請重新輸入<br>";
}
echo "<a href='login.php'>返回登錄頁面</a>";
?>

安全增強說明:

  • setcookie 最後三個參數:path、domain、secure(僅 HTTPS 傳輸)、httponly(防 JS 讀取,緩解 XSS)
  • 生產環境務必啟用 secure 和 httponly
  • 密碼絕不存入 Cookie,僅存非敏感的用戶名

進階建議:更安全的「記住我」方案

僅存用戶名屬於基礎體驗優化。若需實現「免密自動登錄」(記住我),建議採用 Token + 數據庫 方案:

  1. 登錄成功生成隨機 remember_token,存入數據庫(關聯 user_id、過期時間、User-Agent 等指紋)
  2. Cookie 存 user_id:remember_token(加密簽名)
  3. 後續請求驗證 Token 有效性、未過期、指紋匹配
  4. 支持撤銷單裝置、全裝置登出、異地登錄提醒等高級功能

常見問題排查

現象可能原因解決方案
Cookie 不生效輸出內容前已有輸出(含 BOM、空白行)確保 setcookie 在任何 echo/HTML 之前調用
跨子域名不共享未設定 domain 參數設定 domain=.example.com 共享主域及所有子域
HTTPS 下 Cookie 丟失未設定 secure=true生產環境強制 secure 並遷移至全站 HTTPS
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved