PHP 專案常將資料庫帳號密碼寫在配置檔(config.php),佈署至版控或伺服器存在洩露風險。
mod_env 允許在 Apache 配置中設定環境變量,傳遞給 CGI/SSI/PHP 腳本。敏感資訊不落地於代碼庫,僅存在於伺服器配置與進程環境中。
<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
// 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 DB_PASS DB_USER
可在特定 <Directory> 或 .htaccess 中移除繼承的敏感變量,實現最小權限原則。
| 優點 | 缺點/注意 |
|---|---|
| 敏感資訊不進版控 | 需 Apache 權限配置,部署流程稍複雜 |
| 多環境 (dev/stage/prod) 靈活切換 | Windows IIS 不支援 mod_env,需改用其他方式 |
| 進程隔離,原則上僅當前 vhost 可讀 | 共享主機環境可能被其他用戶讀取 /proc/environ |
| 配置即代碼,易於自動化部署 | 環境變量皆為字串,型別轉換需自行處理 |
Apache mod_env 是傳統 LAMP 架構下「配置與代碼分離」的經典實踐。雖然現代雲原生環境有更完善的密鑰管理方案,但理解此機制有助於在遷移期間或混合環境中平滑過渡,守住敏感資訊的最後一道防線。