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

PHP SQL 注入攻擊原理深度解析與防禦實戰

     編輯:PHP 綜合知識

為什麼 SQL 注入依然是頭號威脅?

根據 OWASP Top 10,注入漏洞長年霸榜首位。核心原因在於「數據與代碼未分離」:應用將用戶輸入直接拼接進 SQL 字串,導致惡意輸入被數據庫當作指令執行。

經典攻擊向量

1. 基於 UNION 的注入

-- 原查詢
SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;

-- 攻擊載荷 (URL 編碼後)
0; INSERT INTO pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
   SELECT 'crack', usesysid, 't','t','crack' FROM pg_shadow WHERE usename='postgres'; --

0; 閉合原查詢,-- 註釋掉後續代碼,實現任意 SQL 執行。

2. 錯誤回顯與盲注

' UNION SELECT '1', CONCAT(uname,'-',passwd) AS name, '1971-01-01', '0' FROM usertable; --

利用回顯欄位竊取敏感數據。

3. 堆疊查詢 / 命令執行 (MSSQL)

a%' EXEC master..xp_cmdshell 'net user test testpass /ADD' --

若數據庫權限過高(如 sa),可直接在作業系統建立帳號。

開源 CMS 的額外風險

DedeCMS、EmpireCMS、Discuz、ECShop 等開源系統:

  • 代碼公開 → 攻擊者可離線審計、構造精準 EXP。
  • 第三方插件質量參差不齊,往往成爲突破口。
  • 建議:及時升級、刪除安裝目錄、禁用不必要的標簽/插件、部署 WAF、定期掃描。

防禦黃金法則

  1. 參數化查詢 / 預處理語句(PDO, mysqli) —— 徹底分離代碼與數據。
    $stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
    $stmt->execute([$email]);
  2. 最小權限原則:Web 連接賬號僅擁有 SELECT/INSERT/UPDATE,禁用 DROP、CREATE、FILE、SHUTDOWN 等高危權限。
  3. 輸入驗證與輸出編碼:白名單驗證 ID、排序欄位等;HTML 輸出用 htmlspecialchars。
  4. 關閉錯誤回顯:生產環境 display_errors=Off,錯誤寫日志不顯示給用戶。
  5. 部署 WAF / RASP:ModSecurity、OpenRASP 等可攔截已知攻擊特徵。
  6. 審計日志:記錄所有失敗登錄、異常 SQL、文件上傳等,便於事後溯源。

常見誤區

  • ❌ magic_quotes_gpc=On 就能防注入 → 已棄用,且無法防禦數值型/二次注入。
  • ❌ 自己寫 addslashes / 正則過濾 → 繞過技巧層出不窮(寬字節、編碼、註釋符變形)。
  • ✅ 只有預處理語句 + 最小權限 + 持續審計 才是可靠防線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved