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

PHP 使用者身份驗證兩大實作:HTTP Basic Auth 與 Session 驗證

     編輯:PHP 綜合知識

方法一:HTTP Basic Authentication

瀏覽器原生彈出登入框,憑證透過 HTTP 標頭傳遞。

流程

  1. 檢查 $PHP_AUTH_USER、$PHP_AUTH_PW(需 PHP 模組模式,CGI 模式不可用)。
  2. 未設定 → 送出 WWW-Authenticate: Basic realm="..." + HTTP/1.0 401 Unauthorized。
  3. 瀏覽器彈窗輸入帳密 → 重新請求帶上 Authorization: Basic base64(user:pass)。
  4. 驗證通過 → 允許存取;失敗 → 再次送 401。

程式碼(搭配 MySQL)

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Members Area"');
    header('HTTP/1.0 401 Unauthorized');
    exit('身份驗證失敗');
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
$stmt->execute([$_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']]); // 實務應用密碼雜湊驗證
if (!$stmt->fetch()) {
    header('WWW-Authenticate: Basic realm="Members Area"');
    header('HTTP/1.0 401 Unauthorized');
    exit('帳號或密碼錯誤');
}
// 驗證通過,顯示受保護內容
echo "歡迎,{$_SERVER['PHP_AUTH_USER']}";

方法二:Session 驗證(適用 CGI、IIS、自訂登入頁)

登入頁 login.php

<form action="login_check.php" method="POST">
  帳號:<input name="username"><br>
  密碼:<input name="password" type="password"><br>
  <button type="submit">登入</button>
</form>

驗證邏輯 login_check.php

<?php
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT id, username FROM users WHERE username = ? AND password = ?');
$stmt->execute([$_POST['username'], $_POST['password']]); // 實務用 password_verify()
if ($user = $stmt->fetch()) {
    $_SESSION['user_id'] = $user['id'];
    $_SESSION['username'] = $user['username'];
    header('Location: protected.php');
    exit;
}
echo '登入失敗';

受保護頁面 protected.php

<?php
session_start();
if (empty($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}
echo "歡迎,{$_SESSION['username']}";

比較表

最佳實務建議

  • 生產環境強制 HTTPS,否則帳密/Session ID 明文傳輸。
  • 密碼儲存使用 password_hash() + password_verify()。
  • Session 設定 session.cookie_httponly=1, session.cookie_secure=1, session.use_strict_mode=1。
  • 考慮引入成熟套件(如 laminas/laminas-authentication, Laravel Auth, Symfony Security)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性HTTP Basic AuthSession Auth
登入介面瀏覽器原生彈窗(不可自訂樣式)自訂 HTML 表單
適用環境PHP 模組模式所有環境(CGI、IIS、FastCGI)
登出機制關閉瀏覽器或清除快取session_destroy() 精確控制
CSRF 風險無(非表單提交)需加 CSRF Token
攔截風險Base64 非加密,必須配合 HTTPSSession ID 在 Cookie,需 HttpOnly + Secure + HTTPS