mysql_real_escape_string() 轉義 SQL 特殊字符(\x00, \n, \r, \\, ', ", \x1a),防止 SQL 注入。但有一個關鍵前提:必須先建立資料庫連線,否則報錯。
$con = mysql_connect("localhost", "user", "pass");
$user = mysql_real_escape_string($_POST['user']);
$pwd = mysql_real_escape_string($_POST['pwd']);
$sql = "SELECT * FROM users WHERE user='$user' AND password='$pwd'";
$_POST['user'] = 'john'; $_POST['pwd'] = "' OR ''='"; // SQL 變為: SELECT * FROM users WHERE user='john' AND password='' OR ''=''
任意密碼即可登入。
function check_input($value) {
if (get_magic_quotes_gpc()) $value = stripslashes($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():需連線資源,依當前字元集轉義。mysql_escape_string():無需連線,不考慮字元集,不轉義 % 和 _。建議統一使用 mysqli_real_escape_string()(mysqli 版本)並配合預處理語句,徹底杜絕注入風險。
$link = mysql_connect('host', 'user', 'pass') or die(mysql_error());
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password)
);