首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL SQL 注入防範實戰:參數化查詢、轉義函數、LIKE 特殊處理

     編輯:MySQL 資料庫相關知識

注入原理

用戶輸入未驗證直接拼接 SQL:$name = "Qadir'; DELETE FROM users;"; 導致執行 SELECT * FROM users WHERE name='Qadir'; DELETE FROM users;。

核心防禦原則

  1. 永不信任用戶輸入:白名單驗證、長度限制、格式校驗
  2. 使用參數化查詢(預處理語句):數據與代碼分離,根治注入
  3. 最小權限原則:應用賬號僅授必要權限

PHP + MySQL 實戰防護

1. 輸入驗證(白名單)

if (preg_match('/^\\w{8,20}$/', $_GET['username'], $matches)) {
    $stmt = $pdo->prepare('SELECT * FROM users WHERE username = ?');
    $stmt->execute([$matches[0]]);
}

2. 轉義函數(舊代碼維護用)

if (get_magic_quotes_gpc()) $name = stripslashes($name);
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM users WHERE name='{$name}'");

⚠️ mysql_* 函數已棄用,**強烈建議遷移至 PDO / mysqli 預處理語句**。

3. LIKE 查詢特殊處理

用戶輸入含 %、_ 會改變匹配語義,需雙重轉義:

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \\%something\\_
mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

資料庫層面補充防禦

  • 啟用 sql_mode=STRICT_ALL_TABLES 拒絕異常數據
  • 使用視圖/存儲過程封裝業務邏輯
  • 審計日誌:log_statement = all(PostgreSQL)或通用日誌

框架級防護

  • Laravel Eloquent / Query Builder 自動參數化
  • Django ORM 參數化
  • Spring JdbcTemplate / MyBatis #{}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved