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

PHP HTTP Basic 認證實作:中介軟體封裝、安全性加固與現代替代方案

     編輯:PHP 相關知識

PHP HTTP Basic 認證實作:中介軟體封裝、安全性加固與現代替代方案

HTTP Basic Auth 是最簡單的認證機制,適合內部 API、測試環境、簡單管理後台。本文展示標準實作、中介軟體封裝、安全性注意事項與現代替代方案對比。

一、原生 PHP 實作 (無框架)

<?php
function requireBasicAuth(string $realm = 'Restricted Area', callable $validator): void {
    // 1. 檢查是否已提供認證頭
    if (!isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
        challenge($realm);
    }

    $username = $_SERVER['PHP_AUTH_USER'];
    $password = $_SERVER['PHP_AUTH_PW'];

    // 2. 驗證 (回傳 true/false 或拋出異常)
    if (!$validator($username, $password)) {
        challenge($realm);
    }

    // 3. 認證通過,可選:將用戶資訊存入全域
    $GLOBALS['AUTH_USER'] = $username;
}

function challenge(string $realm): never {
    header('WWW-Authenticate: Basic realm="' . $realm . '"');
    header('HTTP/1.0 401 Unauthorized');
    header('Content-Type: text/plain; charset=utf-8');
    exit('Authentication required');
}

// 使用範例
requireBasicAuth('Admin Panel', function($user, $pass) {
    // 實際應從資料庫查詢並 password_verify()
    return $user === 'admin' && $pass === 'secure-password-from-env';
});

echo "Welcome, {$GLOBALS['AUTH_USER']}!";
?>

二、PSR-15 中介軟體封裝 (適用 Laravel/Slim/Symfony/Mezo)

<?php
namespace App\Http\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class BasicAuthMiddleware implements MiddlewareInterface {
    public function __construct(
        private string $realm,
        private callable $validator // ($username, $password) => bool|UserObject
    ) {}

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
        $auth = $request->getHeaderLine('Authorization');

        if (!$auth || !preg_match('/^Basic\s+(.+)$/i', $auth, $matches)) {
            return $this->challenge();
        }

        $decoded = base64_decode($matches[1]);
        if ($decoded === false || !str_contains($decoded, ':')) {
            return $this->challenge();
        }

        [$username, $password] = explode(':', $decoded, 2);

        $result = ($this->validator)($username, $password);
        if (!$result) {
            return $this->challenge();
        }

        // 將用戶物件注入請求屬性,後續控制器可取用
        $request = $request->withAttribute('auth.user', $result);

        return $handler->handle($request);
    }

    private function challenge(): ResponseInterface {
        $response = new \Laminas\Diactoros\Response\TextResponse('Authentication required', 401);
        return $response->withHeader('WWW-Authenticate', 'Basic realm="' . $this->realm . '"');
    }
}

// 路由註冊範例 (Slim 4)
$app->group('/api/admin', function($group) {
    $group->get('/users', UserController::class . ':list');
})->add(new BasicAuthMiddleware('Admin API', function($u, $p) {
    return UserService::verify($u, $p); // 回傳 User 物件或 false
}));
?>

三、安全性加固清單

風險對策
明文傳輸 (Base64 非加密)強制 HTTPS,否則帳密等同裸奔
暴力破解限流 (Rate Limit)、失敗鎖定、CAPTCHA、雙因子認證 (2FA)
憑證洩露密碼用 password_hash() 儲存,嚴禁明文/可逆加密
CSRFBasic Auth 無 CSRF 風險 (瀏覽器不自動發送),但若混用 Cookie 需防禦
快取敏感頁面回應頭加 Cache-Control: no-store, private
登出困難瀏覽器無標準登出 API,通常靠關閉瀏覽器或修改 realm 強制重新認證

四、現代替代方案對比

方案優點缺點適用場景
JWT (JSON Web Token)無狀態、跨域、攜帶聲明、標準化無法撤銷 (需黑名單)、Payload 可解碼、簽名驗證開銷SPA、微服務、行動端 API
OAuth 2.0 / OpenID Connect授權碼模式、第三方登入、權限範圍、刷新令牌實作複雜、需授權伺服器開放平台、SSO、多應用生態
API Key / Bearer Token簡單、可撤銷、適合機器對機器無用戶身份語意、需自行管理權限內部服務通訊、Webhook 驗證
Session + Cookie (傳統)成熟、支援 CSRF 保護、易撤銷有狀態、需共享存儲 (Redis)、跨域麻煩傳統網站、後台管理
HTTP Basic Auth極簡、標準、無需 Cookie/JS、curl 友善明文傳輸、無登出、無權限細粒度、UX 差內部工具、測試環境、IoT 裝置、單機腳本

五、Laravel 內建 Basic Auth 快速使用

// 路由群組
Route::group(['middleware' => 'auth.basic'], function () {
    Route::get('/api/user', function () {
        return Auth::user();
    });
});

// 自定義守衛 (用 email 而非 username)
Route::group(['middleware' => 'auth.basic:api'], function () { ... });

// config/auth.php
'guards' => [
    'api' => [
        'driver' => 'session', // 或 token
        'provider' => 'users',
    ],
],

六、總結建議

  1. 生產環境外部 API 禁用 Basic Auth,改用 JWT/OAuth/API Key。
  2. 內部/管理/測試環境可用,但**強制 HTTPS + 限流 + 強密碼**。
  3. 封裝為中介軟體,複用驗證邏輯,注入用戶物件供後續使用。
  4. 密碼驗證**必須**用 password_verify(),嚴禁自行比對哈希。

HTTP Basic Auth 雖簡單,但安全邊界清晰:僅在「受信任網路 + HTTPS + 低頻存取」場景使用,其餘一律升級至現代認證體系。

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