本文提供一套基於HTTP基本認證的PHP用戶認證與管理系統,包含認證核心auth.inc、數據庫連接connect.inc、錯誤處理error.inc、用戶表結構、添加用戶示例、後台管理usermanage.php完整源碼。
<?php
$id = "xxxCOM"; // Realm標識
// 1. 檢查HTTP基本認證頭
if (!isset($PHP_AUTH_USER)) {
header("WWW-Authenticate: Basic realm=\"$id\"");
header("HTTP/1.0 401 Unauthorized");
require("error.inc");
exit;
}
$name = $PHP_AUTH_USER;
$pass = $PHP_AUTH_PW;
require("connect.inc");
// 2. 數據庫驗證
$query = "SELECT * FROM auth WHERE username='$name' AND realm='$id'";
$result = mysql_db_query("admin", $query);
if (mysql_num_rows($result) == 0) {
header("WWW-Authenticate: Basic realm=\"$id\"");
header("HTTP/1.0 401 Unauthorized");
require("error.inc");
exit;
}
$active = mysql_result($result, 0, "active");
if ($active == "no") {
// 返回404隱藏存在性
?>
<html><head><title>404 Not Found</title></head>
<body><h1>Not Found</h1>
The requested URL <?php echo $REQUEST_URI; ?> was not found on this server.
</body></html>
<?php exit; ?>
?>
<?php mysql_connect("localhost", "user", ""); ?>
CREATE TABLE auth (
id SMALLINT(6) AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(16) NOT NULL UNIQUE,
lastname TINYBLOB,
firstname TINYBLOB,
password VARCHAR(16),
realm VARCHAR(16),
active CHAR(3),
UNIQUE KEY (username)
);
INSERT INTO auth (username, lastname, firstname, password, realm, active)
VALUES ('admin', 'my', 'love', 'password', 'xxxCOM', 'yes');
<?php include("auth.inc"); ?>
<?php
// 雙重驗證:必須是admin且密碼正確
if ($PHP_AUTH_USER != "admin") {
header("WWW-Authenticate: Basic realm=\"xxxCOM 客戶認證\"");
header("HTTP/1.0 401 Unauthorized");
echo "access Denied!\n";
exit;
}
if ($PHP_AUTH_PW != "mypassword") { ... exit; }
// 啟用用戶
if ($activate) {
include("connect.inc");
$query1 = "UPDATE auth SET active='yes' WHERE id=$id";
$result1 = mysql_db_query("admin", $query1);
if ($result1) echo "$user activated\n";
// ...禁用/刪除邏輯類似...
}
?>
| 缺陷 | 風險等級 | 現代最佳實踐 |
|---|---|---|
| 明文存儲密碼 | 🔴 致命 | password_hash() + password_verify() (bcrypt/argon2) |
| SQL拼接注入 | 🔴 致命 | PDO預處理語句 |
| HTTP基本認證明文傳輸 | 🟠 高危 | HTTPS + 表單登入 + Session/JWT Token |
| 硬編碼管理員密碼 | 🟠 高危 | 數據庫角色表,password_hash存儲 |
| 無CSRF/XSS防護 | 🟡 中危 | CSRF Token + htmlspecialchars輸出編碼 |
| mysql_*棄用函數 | 🟡 中危 | PDO / MySQLi |
| 錯誤信息洩露 | 🟢 低危 | 生產環境關閉display_errors,記錄日誌 |
// 登入控制器
public function login(Request $request) {
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($credentials, $request->boolean('remember'))) {
$request->session()->regenerate();
return redirect()->intended('/dashboard');
}
return back()->withErrors(['email' => '認證失敗'])->onlyInput('email');
}
// 中間件保護路由
Route::middleware('auth')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::resource('users', UserController::class)->middleware('role:admin');
});
password字段(長度≥255存儲hash),移除明文passwordpassword_hash/verifyrole字段或獨立roles表實現RBACremember_token)Secure/HttpOnly/SameSite Cookie屬性此系統雖實現了基本認證與管理閉環,但安全架構停留在PHP 4時代。現代框架(Laravel/Symfony)提供開箱即用的認證脚手架,開發者應專注業務邏輯而非重複造輪子。