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

PHP mysql_real_escape_string 函數用法與防 SQL 注入實例

     編輯:PHP 綜合知識

mysql_real_escape_string:資料庫安全的第一道防線

注意:mysql_* 系列函數自 PHP 5.5 起棄用,PHP 7.0 已移除。現代專案請改用 PDO 或 MySQLi 的預處理語句。本文僅供維護舊專案參考。

函數說明

mysql_real_escape_string(string, connection) 會轉義字串中的特殊字符,並考慮當前連線的字符集,使其可安全用於 mysql_query()。

受影響字符

  • \x00 (Null)
  • \n (換行)
  • \r (回車)
  • \\ (反斜線)
  • ' (單引號)
  • " (雙引號)
  • \x1a (EOF)

參數

參數說明
string必需。要轉義的字串。
connection可選。MySQL 連線資源,預設為上一個開啟的連線。

實例 1:基本防禦

<?php
$con = mysql_connect('localhost', 'user', 'pass');
if (!$con) die('連線失敗: ' . mysql_error());

// 假設從表單取得使用者輸入
$user = $_POST['user'];
$pwd  = $_POST['pwd'];

// 轉義處理
$user = mysql_real_escape_string($user);
$pwd  = mysql_real_escape_string($pwd);

$sql = "SELECT * FROM users WHERE user='$user' AND password='$pwd'";
mysql_query($sql);
mysql_close($con);
?>

實例 2:未轉義導致的 SQL 注入

<?php
// 使用者輸入: user='john', pwd=\"' OR ''='\"
$sql = "SELECT * FROM users WHERE user='{$_POST['user']}' AND password='{$_POST['pwd']}'";
// 實際執行: SELECT * FROM users WHERE user='john' AND password='' OR ''=''
// 結果: 任意密碼皆可登入
?>

實例 3:封裝安全檢查函數

<?php
function check_input($value) {
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}

$user = check_input($_POST['user']);
$pwd  = check_input($_POST['pwd']);
$sql  = "SELECT * FROM users WHERE user=$user AND password=$pwd";
?>

最佳實踐建議

  • 新專案請使用 PDO/MySQLi 預處理語句,徹底分離 SQL 碼與資料。
  • 舊專案若無法重構,務必對所有外部輸入呼叫 mysql_real_escape_string。
  • 搭配 get_magic_quotes_gpc() 檢查,避免重複轉義。
  • 數值型欄位建議用 intval() 或 floatval() 強制轉型,而非依賴轉義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved