眾多 PHP 建站系統 (CMS) 本身安全性參差不齊,若伺服器未做目錄隔離,單一站點被攻破即可能波及全盤。PHP 5.3+ 提供 open_basedir 指令,可將腳本存取限制在指定目錄樹內,有效防範跨站、跨目錄攻擊。本文以 CentOS 為例示範配置流程。
以 root 或具 sudo 權限的使用者 SSH 登入伺服器。
# 常見路徑
/etc/php.ini
/usr/local/php/etc/php.ini
# 以實際安裝路徑為準
[HOST=www.example.com]
open_basedir=/wwwroot/www.example.com/:/tmp/
[PATH=/wwwroot/www.example.com]
open_basedir=/wwwroot/www.example.com/:/tmp/
說明:
[HOST=...]:針對特定虛擬主機域名生效 (PHP 5.3+ 支援)。[PATH=...]:針對實體路徑生效,雙重保障。open_basedir:允許存取的目錄前綴,多個目錄以 : 分隔 (Windows 用 ;)。必須包含網站根目錄與 /tmp (Session、上傳暫存需用)。# PHP-FPM
systemctl restart php-fpm
# 或
service php-fpm restart
# Apache 模組模式
systemctl restart httpd
原因:探針需讀取 /proc 目錄 (CPU、記憶體、負載等)。
解法:在 open_basedir 末尾加入 :/proc/:
open_basedir=/wwwroot/www.example.com/:/tmp/:/proc/
若多站點需共用程式庫,請將共用庫路徑加入 open_basedir,或改用 Composer 自動載入避免硬編碼路徑。
open_basedir restriction in effect檢查腳本嘗試存取的路徑是否在允許清單內,必要時擴展允許目錄。
生產環境建議為每個站點建立獨立 PHP-FPM Pool,設定不同使用者/群組,並在 php_admin_value[open_basedir] 中指定專屬路徑,實現進程級與檔案系統級雙重隔離:
; /etc/php-fpm.d/www.example.com.conf
[www.example.com]
user = www_example
group = www_example
listen = /run/php-fpm/www.example.com.sock
php_admin_value[open_basedir] = /wwwroot/www.example.com/:/tmp/:/proc/
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen
php_admin_value[expose_php] = Off
建立測試檔 test_open_basedir.php:
<?php
$test = @fopen('/etc/passwd', 'r');
if ($test) {
echo "⚠️ 繞過 open_basedir 成功,配置未生效!";
fclose($test);
} else {
echo "✅ open_basedir 生效,跨目錄讀取被攔截。";
}
?>
瀏覽該檔,應顯示「✅ open_basedir 生效...」。
正確配置 open_basedir 並搭配 PHP-FPM Pool 隔離,能大幅提升共享主機或多站點伺服器的安全基線,將單點入侵影響範圍降至最低。