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

PHP 基於 Cookie 與 Session 的用戶登入授權實戰

     編輯:PHP 綜合知識

核心邏輯流程

  1. 檢測 POST 提交的用戶名/密碼
  2. 驗證非空
  3. 連接數據庫,查詢用戶表(密碼用 SHA1 加密)
  4. 驗證通過:啟動 Session、設置登入標記、寫入 Cookie 記住用戶名
  5. 未提交表單時:顯示登入表單,自動填充 Cookie 中的用戶名

完整代碼示例(已修正語法與安全隱患)

<?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>

關鍵安全增強點

  • 棄用 mysql_* 函數: 使用 mysqli 或 PDO,並採用預處理語句防 SQL 注入。
  • 密碼加密: SHA1 已不安全,生產環境請使用 password_hash() + password_verify()(BCrypt/Argon2)。
  • Cookie 安全屬性: HttpOnly 防 XSS 竊取,Secure 僅 HTTPS 傳輸,SameSite 防 CSRF。
  • 輸出轉義: 表單回填用戶名時用 htmlspecialchars() 防 XSS。
  • Session 固定攻擊防護: 登入成功後調用 session_regenerate_id(true)。

「記住我」功能進階方案

若需長期自動登入,勿直接存密碼或簡單 Hash。推薦:
1. 生成隨機 selector + validator 雙 Token。
2. 數據庫存 selector、hash(validator)、過期時間、用戶 ID。
3. Cookie 存 selector:validator(Base64 編碼)。
4. 驗證時查 selector,驗證 hash(validator),通過後重新生成雙 Token(輪換機制)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved