現有系統採用 HTTP Basic Authentication 保護 phpMyAdmin,期望實現「一鍵自動登入」,免去用戶重複輸入帳密,同時保留原有手動登入作為備用方案。
| 模式 | 配置參數 | 特點 |
|---|---|---|
| config | $cfg['Servers'][$i]['auth_type'] = 'config' | 帳密寫死配置檔,極不安全,僅限內網測試 |
| cookie | 'cookie' | 表單登入,最常用,支援記住密碼 |
| http | 'http' | Basic Auth,瀏覽器原生彈窗,體驗差但簡單 |
| signon | 'signon' | 單點登入 (SSO),系統整合首選,需實作 signon_session/signon_url |
現狀為 http 模式,本文針對此模式提供自動登入方案。
401 Unauthorized,附帶 Header:WWW-Authenticate: Basic realm="My Realm"Authorization: Basic base64(username:password)https://username:password@phpmyadmin.example.com/
<script>
function autoLogin() {
var username = 'db_user', password = 'db_pass';
var xhr = new XMLHttpRequest();
// 關鍵:withCredentials 傳送憑證,第三個參數 false 同步阻塞
xhr.open('GET', 'https://phpmyadmin.example.com/', false, username, password);
xhr.withCredentials = true;
xhr.send();
if (xhr.status === 200) {
// 登入成功,導航或嵌入 iframe
window.location.href = 'https://phpmyadmin.example.com/';
}
}
window.onload = autoLogin;
</script>
Access-Control-Allow-Credentials: true + Access-Control-Allow-Origin: 具體域)onload 自動 form.submit()前提: phpMyAdmin 需支援表單登入 (cookie 模式) 或自定義 signon 端點。http 模式無法直接處理 POST 登入。
Authorization: Basic ... HeaderSet-Cookie (若支援 cookie 回寫) 或 Session ID優勢: 繞過瀏覽器同源限制、憑證不經前端、可審計日誌、支援雙因子驗證擴展。
# Nginx 配置片段
location /pma/ {
proxy_pass https://phpmyadmin_backend/;
proxy_set_header Authorization "Basic base64(db_user:db_pass)";
proxy_set_header Host $host;
proxy_hide_header WWW-Authenticate; # 隱藏 401 挑戰
}
/pma/ 直接透過代理帶入憑證$cfg['Servers'][$i]['AllowDeny']['order'] 等)libraries/auth/http.auth.lib.php 中檢測特定 Token/IP/Header,自動設定 $_SERVER['PHP_AUTH_USER']/PHP_AUTH_PW| 風險點 | 緩解措施 |
|---|---|
| 憑證洩露 (日誌、Referer、瀏覽器歷史) | 方案 A 避免使用;方案 B/C 後端注入;定期輪換密碼 |
| CSRF (方案 C 表單提交) | 驗證 Referer/Origin、加入 CSRF Token、SameSite Cookie |
| 中間人竊聽 | 全站強制 HTTPS,HSTS |
| 權限過大 | phpMyAdmin 僅建立只讀/特定庫帳號,避免 root |
| 暴力破解 | Fail2ban 封禁頻繁 401 IP、限制登入頻率 |
<?php
// login.php - 測試 Basic Auth 行為
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Test Realm"');
header('HTTP/1.1 401 Unauthorized');
exit('需要登入');
}
echo "<p>Hello, {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Password: {$_SERVER['PHP_AUTH_PW']}</p>";
?>
瀏覽器訪問觀察彈窗;Chrome DevTools Network 面板查看 Authorization Header 格式。
HTTP Basic Auth 的自動登入本質是 如何安全地將 Authorization: Basic ... Header 注入請求。瀏覽器同源策略與安全機制封殺了簡單前端方案,**後端代理轉發** 或 **反向代理注入** 是工程上正確的解法。長遠規劃應遷移至 signon/SSO 架構,從根源解決認證整合問題。