歷史證明:phpBB、phpMyAdmin、phpNuke 等知名專案皆曾爆出嚴重漏洞。即便開發者盡力過濾輸入,人非聖賢,孰能無過?本文遵循「縱深防禦」原則,從 PHP 引擎、Web 伺服器、資料庫、作業系統四個層面,建立多重防線,使應用層漏洞難以轉化為實際入侵。
display_errors = Off # 關閉錯誤回顯,防止路徑、SQL、堆疊洩露
log_errors = On # 啟用錯誤記錄
error_log = /var/log/php/error.log # 指定專用日誌檔(需可寫)
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT # 記錄所有錯誤
; 禁用高風險函式
disable_functions = exec,system,passthru,shell_exec,proc_open,popen,pcntl_exec, \
curl_exec,curl_multi_exec,parse_ini_file,show_source, \
symlink,link,chroot,chgrp,chown,dl,apache_child_terminate,apache_setenv
; 限制腳本可存取路徑(極關鍵)
open_basedir = /var/www/html:/tmp:/var/lib/php/session
; 限制上傳檔案大小
upload_max_filesize = 2M
post_max_size = 8M
file_uploads = On
upload_tmp_dir = /var/tmp/php_upload # 獨立目錄,權限 700
session.cookie_httponly = 1 # 防 XSS 竊取 Cookie
session.cookie_secure = 1 # 僅 HTTPS 傳輸(需 SSL)
session.use_strict_mode = 1 # 拒絕未初始化 Session ID
session.cookie_samesite = Strict # 防 CSRF
session.gc_maxlifetime = 1440 # 24 分鐘過期
session.save_path = /var/lib/php/session # 獨立目錄,權限 700
<Directory /var/www/html>
# 禁止腳本執行於上傳/快取/日誌目錄
<FilesMatch "\.(php|php3|php4|php5|phtml|inc)$">
Require all denied
</FilesMatch>
# 限制 PHP 只能讀寫 open_basedir 內
php_admin_value open_basedir "/var/www/html:/tmp:/var/lib/php/session"
# 關閉目錄瀏覽
Options -Indexes
# 隱藏版本資訊
ServerTokens Prod
ServerSignature Off
</Directory>
# 禁止存取敏感檔案
<FilesMatch "^\.|composer\.json|composer\.lock|\.env|\.git">
Require all denied
</FilesMatch>
server {
# 隱藏版本
server_tokens off;
# PHP 處理
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 關鍵:防止惡意腳本執行
fastcgi_param PHP_VALUE "open_basedir=/var/www/html:/tmp:/var/lib/php/session";
fastcgi_param PHP_ADMIN_VALUE "disable_functions=exec,system,passthru,shell_exec";
}
# 靜態檔案目錄禁止 PHP
location /uploads/ {
location ~ \.php$ { return 403; }
}
}
SELECT, INSERT, UPDATE, DELETE,禁止 DROP, CREATE, ALTER, FILE, GRANT, SUPER。LOAD DATA LOCAL INFILE(local_infile=0)。skip_show_database、skip_symbolic_links。systemctl edit mariadb → User=mysql Group=mysql。| 路徑 | 擁有者 | 群組 | 權限 | 說明 |
|---|---|---|---|---|
| /var/www/html | root | www-data | 750 | 程式碼唯讀,群組可讀 |
| /var/www/html/uploads | www-data | www-data | 770 | 唯一可寫目錄,禁止執行 |
| /var/lib/php/session | www-data | www-data | 700 | Session 唯寫 |
| /var/log/php | root | adm | 750 | 日誌唯寫 |
核心鐵律:www-data(或 apache/nginx 運行使用者)絕不可為 root,且僅上傳目錄可寫,其餘皆唯讀。
apt update && apt upgrade -y / yum update -y。ufw allow 80,443/tcp ufw enable。fail2ban 防暴力破解,auditd 審計關鍵系統呼叫。rsyslog / Filebeat → ELK / Loki。failed login、SQL syntax、../、eval(、base64_decode、shell_exec。AIDE / Tripwire 定期掃描 Webroot 異動。PHP-Obfuscator、PHPObfuscator(僅提高逆向難度,非絕對安全)。phpinfo() 無敏感資訊洩露(disable_functions、open_basedir 生效).php 檔案回傳 403/500,無法執行display_errors=Off,錯誤頁面無堆疊/路徑FILE/SUPER 權限www-data 無 sudo 權限,home 目錄不可登入immutable 屬性(chattr +i)防竄改PHP 安全非單一設定可達成,需構建「PHP 引擎 → Web 伺服器 → 資料庫 → 檔案系統 → 作業系統 → 監控審計」六層防禦體系。核心三原則:最小權限、預設拒絕、資訊隱藏。定期滲透測試、紅隊演練、漏洞掃描,持續驗證防禦有效性。記住:配置錯誤造成的入侵,遠超程式碼漏洞。