注意: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 連線資源,預設為上一個開啟的連線。 |
<?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);
?>
<?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 ''=''
// 結果: 任意密碼皆可登入
?>
<?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";
?>
mysql_real_escape_string。get_magic_quotes_gpc() 檢查,避免重複轉義。intval() 或 floatval() 強制轉型,而非依賴轉義。