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

PHP 防禦 SQL 注入完全指南:攻擊原理、實戰案例與徹底防護方案

     編輯:PHP 相關知識

SQL 注入仍是 Web 應用頭號安全威脅。本文系統梳理注入分類、多查詢攻擊向量、經典漏洞案例(Invision Power Board),並提供基於 PHP 現代特性的完整防護體系。

一、核心攻擊向量分類

1. 條件注入(WHERE 子句操控)

-- 原始查詢
SELECT * FROM wines WHERE variety = 'lagrein'

-- 注入 1=1 導致全表掃描
SELECT * FROM wines WHERE variety = 'lagrein' OR 1=1

後果:繞過認證、洩露敏感資料、推斷資料庫結構。

2. 資料竄改(UPDATE/SET 注入)

UPDATE wines SET type='red', vintage='9999' WHERE variety = 'lagrein' OR 1=1

全表資料被惡意修改,若無備份將造成不可逆損失。

3. 破壞性刪除(DELETE 注入)

DELETE FROM wines WHERE variety = 'lagrein' OR 1=1

全表清空,災難級後果。

4. 多查詢注入(Query Stacking)

SELECT * FROM wines WHERE variety = 'lagrein'; GRANT ALL ON *.* TO 'BadGuy@%' IDENTIFIED BY 'gotcha';

利用分號終止原查詢,附加惡意指令。MySQL 預設不支援多查詢(mysqli 除非呼叫 mysqli_multi_query),但 SQLite 預設允許,風險極高。

二、經典實戰案例:Invision Power Board 2005 年漏洞

// 登入查詢
$DB->query("SELECT * FROM ibf_members WHERE id=$mid AND password='$pid'");

// 變數來源:Cookie 直接解碼,無任何過濾
$mid = intval($std->my_getcookie('member_id'));  // 強制整數,相對安全
$pid = $std->my_getcookie('pass_hash');         // 直接帶入查詢,極度危險

攻擊者構造 Cookie:pass_hash=' OR 1=1 --,即可繞過密碼驗證登入任意帳號。修復方案:所有外部輸入統一經過 clean_value() 淨化。

三、徹底防護三大支柱

1. 參數化查詢(Prepared Statements)—— 唯一正解

<?php
// PDO 範例
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND status = 1");
$stmt->execute([':email' => $userInput]);
$user = $stmt->fetch();

// mysqli 範例
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param('s', $userInput);
$stmt->execute();

原理:SQL 結構與資料分離編譯,資料永遠不會被解析為 SQL 指令。

2. 輸入驗證與型別強制(纵深防禦)

  • 整數欄位:(int)$input 或 filter_var($input, FILTER_VALIDATE_INT)
  • 識別碼:白名單驗證 in_array($input, $allowedIds, true)
  • 字串長度/格式:正則表達式嚴格限制

3. 最小權限資料庫帳號

  • Web 應用帳號僅擁有必要表的 SELECT/INSERT/UPDATE/DELETE
  • 嚴禁 GRANT ALL、DROP、CREATE、FILE 權限
  • 敏感操作(結構變更、備份)由專用高權限帳號在維護窗口執行

四、避坑清單

錯誤做法風險正確替代
addslashes / mysql_real_escape_string字元集繞過、不支援多位元組編碼參數化查詢
手工拼接 SQL 字串極高風險、維護困難Query Builder / ORM
信任 $_SERVER / $_COOKIE / HTTP 標頭全可控、易被偽造視同不可信輸入,統一驗證
錯誤訊息回顯給前端洩露資料庫結構、協助攻擊者調試生產環境關閉 display_errors,記錄至日誌

五、現代 PHP 專案安全基線

  1. 全專案強制使用 PDO + 參數化查詢,靜態分析工具(PHPStan Level 5+)攔截原生 SQL 拼接。
  2. 引入 WAF(ModSecurity + OWASP CRS)作為邊界防護,但不可替代程式碼層面防禦。
  3. 定期進行自動化 SQL 注入掃描(sqlmap 等)與人工滲透測試。
  4. 建立資料庫審計日誌,異常查詢模式即時告警。

SQL 注入本質是代碼與資料未分離。參數化查詢從語言機制層面徹底解決此問題,配合最小權限與纵深驗證,才能構建真正可信的資料存取層。

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