萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL mysql_escape_string vs mysql_real_escape_string 差異解析:連線需求、字符集感知與防注入最佳實踐

兩函數核心差異

特性mysql_escape_string()mysql_real_escape_string()
需要資料庫連線**不需要****需要** (連線資源)
字符集感知**無視** 當前字符集**依據** 連線字符集轉義
轉義字符不轉義 % 和 _完整轉義 (含 % _)
適用場景離線字串處理、舊代碼相容**所有實際 SQL 構建** (推薦)
PHP 版本狀態PHP 5.3.0 棄用,7.0.0 移除PHP 7.0.0 移除 (改用 mysqli/PDO)

mysql_real_escape_string 轉義字符清單


\0 (NUL), \n, \r, \\, ', ", \x1a (Ctrl+Z)

正確使用範例 (mysqli 程序化)


$mysqli = new mysqli("localhost", "user", "pass", "db");
if ($mysqli->connect_errno) die("Connect failed: " . $mysqli->connect_error);

$user = $_POST['user'];
$pass = $_POST['pass'];

// 參數化查詢 (最佳,完全避免注入)
$stmt = $mysqli->prepare("SELECT * FROM users WHERE user=? AND password=?");
$stmt->bind_param("ss", $user, $pass);
$stmt->execute();

// 若必須拼接 SQL (不推薦)
$safe_user = $mysqli->real_escape_string($user);
$safe_pass = $mysqli->real_escape_string($pass);
$sql = "SELECT * FROM users WHERE user='$safe_user' AND password='$safe_pass'";

舊版 mysql_escape_string 範例 (僅供維護舊代碼參考)


$item = "zak's laptop";
$escaped = mysql_escape_string($item);
// 結果: zak\'s laptop
// 注意:% 和 _ 未轉義,LIKE 查詢會有語義改變風險

現代最佳實踐:棄用 mysql_* / mysqli_escape_string

  1. 優先使用參數化查詢 (Prepared Statements) — 根治 SQL 注入
  2. PDO / mysqli 皆支援
  3. 動態識別碼 (表名、欄位名) 使用白名單驗證 + 反引號包裹
  4. 輸出到 HTML 使用 htmlspecialchars(),非資料庫轉義函數

總結

mysql_real_escape_string 是舊時代「拼接 SQL」的最佳防護,但現代開發**務必使用參數化查詢**,徹底分離代碼與資料。

copyright © 萬盛學電腦網 all rights reserved