PHP 安全不僅是設定 php.ini,而是一個分層防護體系:作業系統 → Web Server → PHP 引擎 → 應用代碼。本文基於木翼下載系統的安全配置說明,系統化梳理關鍵防護點。
chroot 啟動 Apache,限制進程可見檔案系統範圍。若被攻破,僅影響隔離環境。www-data)運行;取消其他用戶對關鍵系統命令(/bin/sh, /bin/ls 等)的讀/執行權限。mod_autoindex, mod_cgi 等未用模組。| 漏洞類型 | 影響版本 | 風險 | 修復 |
|---|---|---|---|
| 檔案上傳緩衝區溢位 | PHP < 4.1.2 | 遠程代碼執行 | 升級至最新版 |
| multipart/form-data DoS | 4.2.0 - 4.2.1 | 拒絕服務 | 升級 |
| mail() 繞過 safe_mode 執行命令 | 4.0.5 - 4.2.2 | 任意命令執行 | 升級 ≥ 4.2.3 |
核心原則:務必升級至官方支援的最新穩定版,舊版本漏洞利用代碼公開普遍,風險極高。
; php.ini
safe_mode = On ; 僅限 PHP < 5.4,已棄用移除
safe_mode_gid = On ; 放寬為 GID 比對
safe_mode_exec_dir = /safe/bin ; 限制可執行程式目錄
; 現代替代方案:
open_basedir = /var/www/html:/tmp:/usr/local/php/lib
open_basedir 限制腳本可存取的目錄前綴,支援多目錄(Windows 用 ;,Linux 用 : 分隔)。必須以斜線結尾精確限制目錄,如 /var/www/html/。
register_globals = Off
防止 URL 參數直接注入全域變數(如 ?auth=1 覆蓋 $auth)。PHP 4.2.0+ 預設關閉,但舊代碼可能依賴此特性,需逐步重構初始化變數習慣。
allow_url_fopen = Off:禁止 fopen(), include() 等函式讀取遠程 URL,阻斷 RFI(遠程檔案包含)。open_basedir 同時限制本地檔案包含範圍。basename()、realpath() 校驗。is_uploaded_file()、move_uploaded_file() 驗證並移動上傳檔,防止系統檔案被偽裝上傳。getimagesize() 驗證圖片)。php_flag engine off 禁用 PHP 解析,即使上傳 .php 也不會執行。www-data 可寫,不可執行。exec(), shell_exec(), system(), passthru(), popen(), 反引號 `。escapeshellcmd() 處理整條命令,escapeshellarg() 處理單個參數。safe_mode(舊版)或 disable_functions 禁用高危函式。magic_quotes_gpc = Off(已棄用),改用預處理語句:PDO::prepare(), mysqli_stmt_prepare()。FILE, CREATE, DROP 等管理權限。display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL
生產環境關閉頁面顯示,記錄至專屬日誌(需 www-data 可寫),定期審計日誌發現潛在問題。
disable_functions = phpinfo, get_cfg_var, ini_alter, ini_restore, exec, system, shell_exec, passthru, popen, proc_open, pcntl_exec
disable_classes =
根據實際業務精簡禁用列表,減少攻擊面。
htmlspecialchars() 轉義(防 XSS)。session_regenerate_id(true) 防固定攻擊,設定 session.cookie_httponly=1, session.cookie_secure=1(HTTPS)。password_hash() (bcrypt/Argon2) 儲存,驗證用 password_verify()。readfile() 而非直接重定向,驗證路徑在允許目錄內。composer audit)、靜態分析(PHPStan)、滲透測試。安全是持續過程,而非一次性配置。建立「升級 → 配置 → 代碼審計 → 監控 → 應急響應」閉環,才能有效降低風險。