萬盛學電腦網

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

PHP 防注入函數大比拼:mysql_real_escape_string vs addslashes 差異詳解

核心差異一覽

特性addslashes()mysql_real_escape_string()
轉義字元單引號、雙引號、反斜線、NULNUL、\n、\r、\、'、"、Control-Z(依連線字元集)
字元集感知否(僅按位元組)是(依當前連線字元集)
PHP 版本需求所有版本PHP 4.3.0+ / PHP 5+
資料庫連線需求不需要需要有效連線資源
適用場景通用字串轉義、非 MySQL 環境MySQL 專用、含多位元組字元(中文)環境

函數原型與手冊說明

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  • 將字串中的特殊字元轉義,並參考當前連線字元集,安全用於 mysql_query()。
  • 不轉義 % 和 _(LIKE 查詢萬用字元)。

實測範例

<?php
$item = "Zak's and Derick's Laptop";
$escaped_item = mysql_real_escape_string($item);
printf("Escaped string: %s\n", $escaped_item);
// 輸出:Escaped string: Zak\'s and Derick\'s Laptop
?>

addslashes 典型用法與 magic_quotes_gpc 陷阱

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}
// 建議:無論 magic_quotes_gpc 開關,統一檢查並處理

注意:PHP 5.4+ 已移除 magic_quotes_gpc,舊代碼需重構。

mysql_escape_string vs mysql_real_escape_string

  • mysql_escape_string:不考慮連線字元集,已棄用。
  • mysql_real_escape_string:考慮連線字元集,安全性更高。

MySQL C API 底層轉義字元對照

根據 MySQL 手冊,mysql_real_escape_string 實際轉義以下字元:

  • NUL (ASCII 0)
  • \n (換行)
  • \r (回車)
  • \ (反斜線)
  • ' (單引號)
  • " (雙引號)
  • Control-Z (Windows EOF)

嚴格來說,MySQL 僅要求轉義反斜線與引號即可用於查詢字串,其餘為了日誌可讀性。

總結建議

  1. 現代專案請改用 PDO 或 MySQLi 預處理語句,徹底避免手動轉義。
  2. 若必須維護舊代碼:有資料庫連線且含多位元組字元(UTF-8/GBK)時,務必用 mysql_real_escape_string。
  3. addslashes 僅適用於單位元組字元集或非資料庫場景。
  4. 關閉 magic_quotes_gpc,統一在代碼層處理轉義。
copyright © 萬盛學電腦網 all rights reserved