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

PHP 安全配置深度指南:從 Web 伺服器到代碼層面的全方位防護

     編輯:PHP 綜合知識

前言

PHP 安全不僅是設定 php.ini,而是一個分層防護體系:作業系統 → Web Server → PHP 引擎 → 應用代碼。本文基於木翼下載系統的安全配置說明,系統化梳理關鍵防護點。

第一層:Web 伺服器與作業系統

  • Chroot 隔離:以 chroot 啟動 Apache,限制進程可見檔案系統範圍。若被攻破,僅影響隔離環境。
  • 最小權限原則:Apache 進程以非 root 低權限用戶(如 www-data)運行;取消其他用戶對關鍵系統命令(/bin/sh, /bin/ls 等)的讀/執行權限。
  • 日誌保護:移除 Apache 存取/錯誤日誌的「其他用戶」讀權限,防止本地包含漏洞(LFI)讀取日誌並注入代碼執行。
  • 模組精簡:僅載入必要的 Apache 模組,移除 mod_autoindex, mod_cgi 等未用模組。

第二層:PHP 核心版本與已知漏洞

漏洞類型影響版本風險修復
檔案上傳緩衝區溢位PHP < 4.1.2遠程代碼執行升級至最新版
multipart/form-data DoS4.2.0 - 4.2.1拒絕服務升級
mail() 繞過 safe_mode 執行命令4.0.5 - 4.2.2任意命令執行升級 ≥ 4.2.3

核心原則:務必升級至官方支援的最新穩定版,舊版本漏洞利用代碼公開普遍,風險極高。

第三層:PHP 核心安全配置

1. 啟用 safe_mode(舊版本)或改用 open_basedir

; 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/。

2. 關閉 register_globals

register_globals = Off

防止 URL 參數直接注入全域變數(如 ?auth=1 覆蓋 $auth)。PHP 4.2.0+ 預設關閉,但舊代碼可能依賴此特性,需逐步重構初始化變數習慣。

3. 限制檔案操作與包含

  • allow_url_fopen = Off:禁止 fopen(), include() 等函式讀取遠程 URL,阻斷 RFI(遠程檔案包含)。
  • open_basedir 同時限制本地檔案包含範圍。
  • 代碼層面:絕不直接用用戶輸入作為檔案路徑參數,需經白名單驗證或 basename()、realpath() 校驗。

4. 檔案上傳防護

  • 使用 is_uploaded_file()、move_uploaded_file() 驗證並移動上傳檔,防止系統檔案被偽裝上傳。
  • 嚴格檢查副檔名、MIME 類型、檔案內容(如 getimagesize() 驗證圖片)。
  • 上傳目錄設定 php_flag engine off 禁用 PHP 解析,即使上傳 .php 也不會執行。
  • 目錄權限:僅 www-data 可寫,不可執行。

5. 命令執行防護

  • 盡量避免 exec(), shell_exec(), system(), passthru(), popen(), 反引號 `。
  • 必須使用時:escapeshellcmd() 處理整條命令,escapeshellarg() 處理單個參數。
  • 啟用 safe_mode(舊版)或 disable_functions 禁用高危函式。

6. SQL 注入防護

  • 啟用 magic_quotes_gpc = Off(已棄用),改用預處理語句:PDO::prepare(), mysqli_stmt_prepare()。
  • 數值型欄位也必須用參數綁定,不可直接拼接。
  • 資料庫帳號最小權限:僅授予應用所需資料庫的 CRUD,禁止 FILE, CREATE, DROP 等管理權限。

7. 錯誤資訊不外洩

display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
error_reporting = E_ALL

生產環境關閉頁面顯示,記錄至專屬日誌(需 www-data 可寫),定期審計日誌發現潛在問題。

8. 禁用敏感函式與類

disable_functions = phpinfo, get_cfg_var, ini_alter, ini_restore, exec, system, shell_exec, passthru, popen, proc_open, pcntl_exec
disable_classes = 

根據實際業務精簡禁用列表,減少攻擊面。

第四層:應用代碼安全編碼清單

  1. 所有輸出經 htmlspecialchars() 轉義(防 XSS)。
  2. 所有 SQL 使用預處理(防注入)。
  3. 表單提交驗證 CSRF Token。
  4. Session 使用 session_regenerate_id(true) 防固定攻擊,設定 session.cookie_httponly=1, session.cookie_secure=1(HTTPS)。
  5. 密碼使用 password_hash() (bcrypt/Argon2) 儲存,驗證用 password_verify()。
  6. 檔案下載使用 readfile() 而非直接重定向,驗證路徑在允許目錄內。
  7. 定期進行依賴掃描(composer audit)、靜態分析(PHPStan)、滲透測試。

總結

安全是持續過程,而非一次性配置。建立「升級 → 配置 → 代碼審計 → 監控 → 應急響應」閉環,才能有效降低風險。

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