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

PHP 伺服器端安全配置全攻略:從 php.ini 到系統層級防護

     編輯:PHP 綜合知識

前言:假設應用層已失守

歷史證明:phpBB、phpMyAdmin、phpNuke 等知名專案皆曾爆出嚴重漏洞。即便開發者盡力過濾輸入,人非聖賢,孰能無過?本文遵循「縱深防禦」原則,從 PHP 引擎、Web 伺服器、資料庫、作業系統四個層面,建立多重防線,使應用層漏洞難以轉化為實際入侵。

第一層:PHP 引擎配置 (php.ini)

1. 錯誤處理:資訊不外洩

display_errors = Off          # 關閉錯誤回顯,防止路徑、SQL、堆疊洩露
log_errors = On               # 啟用錯誤記錄
error_log = /var/log/php/error.log  # 指定專用日誌檔(需可寫)
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT  # 記錄所有錯誤

2. 安全模式與函式禁用(PHP 5.4 移除 safe_mode,改用 open_basedir + disable_functions)

; 禁用高風險函式
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

3. Session 安全

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

第二層:Web 伺服器配置 (Apache / Nginx)

Apache (httpd.conf / .htaccess)

<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>

Nginx (nginx.conf)

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; }
    }
}

第三層:資料庫與檔案系統權限

MySQL/MariaDB 最小權限原則

  • 應用帳號僅擁有特定資料庫的 SELECT, INSERT, UPDATE, DELETE,禁止 DROP, CREATE, ALTER, FILE, GRANT, SUPER。
  • 禁用 LOAD DATA LOCAL INFILE(local_infile=0)。
  • 啟用 skip_show_database、skip_symbolic_links。
  • 以非 root 使用者啟動:systemctl edit mariadb → User=mysql Group=mysql。

檔案系統權限模型

路徑擁有者群組權限說明
/var/www/htmlrootwww-data750程式碼唯讀,群組可讀
/var/www/html/uploadswww-datawww-data770唯一可寫目錄,禁止執行
/var/lib/php/sessionwww-datawww-data700Session 唯寫
/var/log/phprootadm750日誌唯寫

核心鐵律:www-data(或 apache/nginx 運行使用者)絕不可為 root,且僅上傳目錄可寫,其餘皆唯讀。

第四層:作業系統與監控

1. 系統加固

  • 及時套用安全更新:apt update && apt upgrade -y / yum update -y。
  • 關閉非必要服務與埠口,僅開放 80/443/22(SSH 建議改埠+金鑰登入)。
  • 啟用防火牆:ufw allow 80,443/tcp ufw enable。
  • 安裝 fail2ban 防暴力破解,auditd 審計關鍵系統呼叫。

2. 日誌審計與入侵偵測

  • 集中化日誌:rsyslog / Filebeat → ELK / Loki。
  • 關注關鍵字:failed login、SQL syntax、../、eval(、base64_decode、shell_exec。
  • 部署 WAF:ModSecurity (OWASP CRS) / Cloudflare WAF / OpenResty + Lua WAF。
  • 檔案完整性監控:AIDE / Tripwire 定期掃描 Webroot 異動。

3. 程式碼加密與混淆(選擇性)

  • Zend Guard / ionCube Encoder:編譯為 Opcode,防原始碼洩露與竄改。
  • 開源替代:PHP-Obfuscator、PHPObfuscator(僅提高逆向難度,非絕對安全)。
  • 注意:加密後除錯困難,建議「開發環境明文、生產環境加密」雙軌制。

驗證清單:上線前必檢

  1. [ ] phpinfo() 無敏感資訊洩露(disable_functions、open_basedir 生效)
  2. [ ] 上傳目錄上傳 .php 檔案回傳 403/500,無法執行
  3. [ ] display_errors=Off,錯誤頁面無堆疊/路徑
  4. [ ] 資料庫連線帳號無 FILE/SUPER 權限
  5. [ ] www-data 無 sudo 權限,home 目錄不可登入
  6. [ ] 關鍵目錄 immutable 屬性(chattr +i)防竄改
  7. [ ] WAF 規則生效,測試 SQLi/XSS Payload 被攔截

總結

PHP 安全非單一設定可達成,需構建「PHP 引擎 → Web 伺服器 → 資料庫 → 檔案系統 → 作業系統 → 監控審計」六層防禦體系。核心三原則:最小權限、預設拒絕、資訊隱藏。定期滲透測試、紅隊演練、漏洞掃描,持續驗證防禦有效性。記住:配置錯誤造成的入侵,遠超程式碼漏洞。

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