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

PHP 防禦 SQL 注入攻擊(一):原理剖析與入門防範

     編輯:PHP 綜合知識

什麼是 SQL 注入?

SQL 注入是駭客攻擊網站最常見手段之一。當應用程式未對用戶輸入進行嚴格驗證,直接拼接進 SQL 語句時,攻擊者可構造惡意輸入,改變 SQL 邏輯,導致數據洩露、篡改甚至刪除整庫數據。

經典攻擊示例

// 假設用戶輸入:ilia'; DELETE FROM users; --
$name = "ilia'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");

最終執行的 SQL 變為:

SELECT * FROM users WHERE name='ilia'; DELETE FROM users; --'

若資料庫支援多語句執行(如 SQLite、PostgreSQL),users 表所有記錄將被刪除。MySQL 的 mysql_query() 預設不支援多語句,因此較安全,但不可掉以輕心。

根本原因

核心問題在於代碼與數據未分離:用戶輸入被視為 SQL 代碼的一部分參與解析。任何拼接字符串構建 SQL 的方式皆存在風險。

初級防範措施

  1. 輸入驗證與白名單:僅允許預期格式的數據(如數字、字母、郵箱格式)。
  2. 字符轉義:使用資料庫專用函數(mysqli_real_escape_string、pg_escape_string)轉義特殊字符。
  3. 最小權限原則:資料庫賬號僅授予必要操作權限(如僅 SELECT、INSERT),禁止 DROP、DELETE 等高危操作。

為何這些措施不夠?

  • 轉義函數可能因字符集、版本差異失效。
  • 開發者易漏掉某些輸入點(如 Cookie、HTTP Header)。
  • 二次注入(存儲時轉義,後續查詢時未轉義直接拼接)難以防範。

系列預告

本系列將深入探討:

  • Magic Quotes 與資料庫轉義函數的優缺點(第二篇)
  • 預處理語句——徹底解決方案(第三篇)
  • 實戰案例與進階防禦技巧

敬請期待後續內容,共同構建安全的 PHP 應用。

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