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

PHP用戶認證與管理系統:HTTP基本認證、MySQL存儲、後台管理完整源碼

     編輯:PHP 相關知識

本文提供一套基於HTTP基本認證的PHP用戶認證與管理系統,包含認證核心auth.inc、數據庫連接connect.inc、錯誤處理error.inc、用戶表結構、添加用戶示例、後台管理usermanage.php完整源碼。

核心文件解析

1. auth.inc - 認證攔截器

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

2. connect.inc - 數據庫連接

<?php mysql_connect("localhost", "user", ""); ?>

3. 用戶表結構

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)
);

4. 添加用戶示例

INSERT INTO auth (username, lastname, firstname, password, realm, active) 
VALUES ('admin', 'my', 'love', 'password', 'xxxCOM', 'yes');

5. usermanage.php - 後台管理(僅admin可訪問)

<?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');
});

遷移清單

  1. 添加password字段(長度≥255存儲hash),移除明文password
  2. 註冊/登入使用password_hash/verify
  3. 引入role字段或獨立roles表實現RBAC
  4. 實現「記住我」長期Token(remember_token)
  5. 添加登入日誌(IP、UA、時間、成功/失敗)
  6. 實現密碼重置流程(Token+郵件、有效期、一次性)
  7. 啟用HTTPS,設置Secure/HttpOnly/SameSite Cookie屬性

此系統雖實現了基本認證與管理閉環,但安全架構停留在PHP 4時代。現代框架(Laravel/Symfony)提供開箱即用的認證脚手架,開發者應專注業務邏輯而非重複造輪子。

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