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

PHP 基本 HTTP 認證實作:.htaccess 替代方案與安全最佳實務

     編輯:PHP 相關知識

前言

HTTP Basic Authentication 可在無資料庫、無 Session 情況下保護特定頁面。PHP 透過 $_SERVER['PHP_AUTH_USER'] 與 $_SERVER['PHP_AUTH_PW'] 取得瀏覽器送來的帳密。本文示範完整實作與安全強化。

基本實作

<?php
// 設定合法帳密(實務應從環境變數/設定檔讀取)
$validUser = 'admin';
$validPass = 'secret123';

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    // 瀏覽器未提供憑證,要求認證
    header('WWW-Authenticate: Basic realm="Admin Area"');
    header('HTTP/1.0 401 Unauthorized');
    exit('需要有效憑證才能存取');
}

if ($_SERVER['PHP_AUTH_USER'] !== $validUser || $_SERVER['PHP_AUTH_PW'] !== $validPass) {
    // 憑證錯誤,再次要求認證
    header('WWW-Authenticate: Basic realm="Admin Area"');
    header('HTTP/1.0 401 Unauthorized');
    exit('帳號或密碼錯誤');
}

// 認證通過
echo "歡迎進入管理區域, {$_SERVER['PHP_AUTH_USER']}!";
?>

安全最佳實務

  1. 必須使用 HTTPS:Basic Auth 以 Base64 編碼傳輸帳密,明文等同,非加密。生產環境強制 HTTPS。
  2. 帳密儲存:勿硬編碼,使用 password_hash() 儲存雜湊,驗證用 password_verify()。
    $hash = '$2y$10$...'; // password_hash('secret123', PASSWORD_DEFAULT)
    if (!password_verify($_SERVER['PHP_AUTH_PW'], $hash)) { ... }
  3. 限制嘗試次數:記錄失敗 IP,超過閾值暫時封鎖(防暴力破解)。
  4. Realm 設定:realm="Admin Area" 讓瀏覽器區分不同保護區域,避免憑證混用。

登出機制

HTTP Basic Auth 無標準登出 API,常見做法:

  • 回傳 401 讓瀏覽器清除憑證快取:header('HTTP/1.1 401 Unauthorized');
  • 變更 Realm 名稱,瀏覽器視為新區域重新詢問。
  • 前端提供「登出」連結指向會觸發 401 的頁面。

替代方案:Digest Authentication

WWW-Authenticate: Digest 以挑戰-回應機制避免明文傳輸,但實作複雜,現代專案多改用 Token (JWT) 或 Session 認證。

總結

HTTP Basic Auth 適合簡單內部工具、開發環境保護,生產環境必須配合 HTTPS、密碼雜湊、嘗試限制。希望本文對您的 PHP 程式設計有所幫助。

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