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

MySQL 防注入必讀:addslashes、mysql_escape_string、mysql_real_escape_string 差異與最佳實踐

     編輯:MySQL 綜合教學

前言

SQL 注入是 Web 應用頭號威脅。PHP 早期常用 addslashes,但對多位元組字符集(GBK、UTF-8)存在繞過風險。本文深度解析三大轉義函數差異,並給出現代最佳實踐。

函數對照表

函數轉義字符字符集感知PHP 版本狀態
addslashes' " \ NULL❌ 無全版本可用
mysql_escape_string\x00 \n \r \ ' " \x1a❌ 無PHP 5.3 棄用,7.0 移除
mysql_real_escape_string\x00 \n \r \ ' " \x1a✅ 有(需連線)PHP 5.3+ 可用,7.0 移除

為何 addslashes 不安全?

GBK 編碼下,攻擊者可送入 0xBF27(單位元組 ' 經過 addslashes 變 0xBF5C27),0xBF5C 為合法雙位元組字符,導致單引號「倖存」並閉合 SQL 字串。

正確防禦策略(按推薦順序)

  1. 參數化查詢(Prepared Statements):
    PDO / MySQLi 使用佔位符,徹底分離代碼與資料。
    $stmt = $pdo->prepare('SELECT * FROM users WHERE name = ?');
    $stmt->execute([$name]);
  2. PDO::quote() / mysqli_real_escape_string():
    若無法使用預處理(極少數動態表名/欄位名場景),必須在已建立連線後呼叫,確保字符集正確。
    $safe = $pdo->quote($input); // 含引號
    $safe = $mysqli->real_escape_string($input);
  3. 設定連線字符集:
    SET NAMES utf8mb4 或 DSN 指定 charset=utf8mb4,確保轉義函數與資料庫字符集一致。

遺留專案快速修補

若暫時無法改用預處理,請將所有 addslashes($input) 替換為 mysql_real_escape_string($input)(需在 mysql_connect 之後呼叫),並確認連線字符集為 utf8mb4 或 gbk。

總結

  • addslashes 僅適用單位元組字符集,嚴禁用於 GBK/UTF-8 環境。
  • mysql_escape_string 已移除,不可使用。
  • mysql_real_escape_string 雖有字符集感知,但屬 mysql_* 擴展(已移除),新專案請直接用 PDO/MySQLi 預處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved