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

PHP 防 SQL 注入實戰(二):注入攻擊類型全解析與多查詢風險

     編輯:PHP 綜合知識

理解敵人是防禦前提。本文系統梳理 SQL 注入的核心攻擊向量——從基礎條件操控到毀滅性的多語句注入,並深入分析 MySQL、MySQLi、SQLite 在多查詢處理上的差異,為制定分級防禦策略提供理論支撐。

一、四大經典注入攻擊模式

1. 條件永真注入(SELECT 洩露全表)

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

注入載荷:lagrein' OR 1=1;--

結果:SELECT * FROM wines WHERE variety = 'lagrein' OR 1=1;--'

危害:繞過認證、遍歷敏感表、推斷 Schema 結構。

2. UPDATE 權限提升與全量篡改

原查詢:UPDATE wines SET type='red' WHERE variety = 'lagrein'

注入載荷:lagrein', vintage='9999' WHERE 1=1;--

結果:UPDATE wines SET type='red', vintage='9999' WHERE 1=1;--'

危害:任意字段修改、全表數據破壞、繞過業務邏輯約束。

3. DELETE 核彈級清洗

注入載荷:lagrein' OR 1=1;--

結果:DELETE FROM wines WHERE variety = 'lagrein' OR 1=1;--'

危害:不可逆的全表數據刪除,災難恢復成本極高。

4. 多語句注入:單點突破,全庫淪陷

利用分號終止原語句,追加任意惡意 SQL:

原查詢: SELECT * FROM wines WHERE variety = 'lagrein'
注入後: SELECT * FROM wines WHERE variety = 'lagrein'; GRANT ALL ON *.* TO 'BadGuy@%' IDENTIFIED BY 'gotcha';--

理論後果:創建超級用戶、竊取數據、植入後門、執行系統命令(若啟用 INTO OUTFILE/LOAD DATA)。

二、多查詢在不同驅動/數據庫中的真實表現

| 環境 | 預設是否支援多查詢 | 關鍵說明 | |------|-------------------|----------| | **MySQL C API / mysql 客戶端** | ✅ 支援 | 原生允許分號分隔多語句 | | **PHP mysql 擴展 (舊版)** | ❌ **禁止** | mysql_query() 僅執行首條語句,其餘靜默失敗,**意外成為天然防線** | | **PHP mysqli 擴展** | ❌ 預設禁止 / ✅ 可開啟 | 提供 mysqli_multi_query() 顯式支援,預設單查詢模式安全 | | **PDO MySQL** | ❌ 預設禁止 | PDO::MYSQL_ATTR_MULTI_STATEMENTS 可開啟,但預設安全 | | **SQLite (PHP 5 綁定)** | ⚠️ **部分支援** | 批量 INSERT 優化導致默認允許多語句;但 sqlite_query() 若需返回結果集則禁止多查詢 |

三、防禦策略矩陣

  1. 首選:參數化查詢(預處理) —— 從語法層面徹底隔離代碼與數據,免疫所有上述注入類型。
  2. 次選:嚴格輸入驗證 + 上下文感知轉義 —— 白名單驗證枚舉值、整數範圍、正則格式;輸出編碼針對 HTML/JS/SQL 不同上下文。
  3. 纵深措施:
    • 資料庫用戶最小權限(僅 SELECT/INSERT/UPDATE/DELETE,無 GRANT/DROP/CREATE)。
    • 禁用 mysqli_multi_query、PDO::MYSQL_ATTR_MULTI_STATEMENTS 除非極少數批量導入場景。
    • 啟用 WAF(ModSecurity + OWASP CRS)攔截明顯攻擊特徵。
    • 審計日誌記錄所有失敗查詢與異常錯誤,配合 SIEM 告警。

關鍵認知

💡 PHP 舊版 mysql_query() 「不支援多查詢」的特性,曾在歷史上默默保護了無數未參數化的應用。但這絕非可依賴的防線——升級驅動、遷移數據庫、啟用新特性都可能打破這層屏障。唯有參數化查詢是永恆的正解。

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