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

使用 Apache mod_env 保護 PHP 敏感配置資訊 (資料庫帳密等)

     編輯:PHP 綜合知識

痛點

PHP 專案常將資料庫帳號密碼寫在配置檔(config.php),佈署至版控或伺服器存在洩露風險。

解決方案:Apache mod_env

mod_env 允許在 Apache 配置中設定環境變量,傳遞給 CGI/SSI/PHP 腳本。敏感資訊不落地於代碼庫,僅存在於伺服器配置與進程環境中。

Apache 配置範例

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    # 設定環境變量
    SetEnv DB_HOST 192.168.1.1
    SetEnv DB_USER fdipzone
    SetEnv DB_PASS 123456
    SetEnv DB_NAME mydb

    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

或在 .htaccess(需 AllowOverride FileInfo):

SetEnv DB_HOST 192.168.1.1
SetEnv DB_USER fdipzone
SetEnv DB_PASS 123456

PHP 讀取方式

<?php
// config.php
return [
    'database' => [
        'host' => $_SERVER['DB_HOST'] ?? getenv('DB_HOST'),
        'user' => $_SERVER['DB_USER'] ?? getenv('DB_USER'),
        'password' => $_SERVER['DB_PASS'] ?? getenv('DB_PASS'),
        'name' => $_SERVER['DB_NAME'] ?? getenv('DB_NAME'),
    ]
];
?>
  • $_SERVER['VAR']、getenv('VAR')、apache_getenv('VAR') 皆可讀取。
  • 建議提供預設值或拋出異常,避免配置遺漏導致靜默失效。

UnsetEnv 移除變量

UnsetEnv DB_PASS DB_USER

可在特定 <Directory> 或 .htaccess 中移除繼承的敏感變量,實現最小權限原則。

優缺點評估

優點缺點/注意
敏感資訊不進版控需 Apache 權限配置,部署流程稍複雜
多環境 (dev/stage/prod) 靈活切換Windows IIS 不支援 mod_env,需改用其他方式
進程隔離,原則上僅當前 vhost 可讀共享主機環境可能被其他用戶讀取 /proc/environ
配置即代碼,易於自動化部署環境變量皆為字串,型別轉換需自行處理

現代替代方案

  • Docker Secrets / Kubernetes Secrets:容器化部署首選。
  • HashiCorp Vault:集中式密鑰管理,支援動態租約。
  • PHP dotenv (.env):開發環境常用,生產環境不建議 將 .env 放在 DocumentRoot 內。

結語

Apache mod_env 是傳統 LAMP 架構下「配置與代碼分離」的經典實踐。雖然現代雲原生環境有更完善的密鑰管理方案,但理解此機制有助於在遷移期間或混合環境中平滑過渡,守住敏感資訊的最後一道防線。

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