瀏覽器原生彈出登入框,憑證透過 HTTP 標頭傳遞。
$PHP_AUTH_USER、$PHP_AUTH_PW(需 PHP 模組模式,CGI 模式不可用)。WWW-Authenticate: Basic realm="..." + HTTP/1.0 401 Unauthorized。Authorization: Basic base64(user:pass)。<?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']}";
<form action="login_check.php" method="POST">
帳號:<input name="username"><br>
密碼:<input name="password" type="password"><br>
<button type="submit">登入</button>
</form>
<?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 '登入失敗';
<?php
session_start();
if (empty($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
echo "歡迎,{$_SESSION['username']}";
| 特性 | HTTP Basic Auth | Session Auth |
|---|---|---|
| 登入介面 | 瀏覽器原生彈窗(不可自訂樣式) | 自訂 HTML 表單 |
| 適用環境 | PHP 模組模式 | 所有環境(CGI、IIS、FastCGI) |
| 登出機制 | 關閉瀏覽器或清除快取 | session_destroy() 精確控制 |
| CSRF 風險 | 無(非表單提交) | 需加 CSRF Token |
| 攔截風險 | Base64 非加密,必須配合 HTTPS | Session ID 在 Cookie,需 HttpOnly + Secure + HTTPS |