Hàm PHP mysql_real_escape_string()

Định nghĩa và cách sử dụng

Hàm mysql_real_escape_string() chuyển mã các ký tự đặc biệt trong chuỗi được sử dụng trong câu lệnh SQL.

Các ký tự sau bị ảnh hưởng:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

Nếu thành công, hàm này sẽ trả về chuỗi đã được chuyển mã. Nếu thất bại, sẽ trả về false.

Cú pháp

mysql_real_escape_string(string,connection)
Tham số Mô tả
string Bắt buộc. Định nghĩa chuỗi cần được chuyển mã.
connection Tùy chọn. Định nghĩa kết nối MySQL. Nếu không quy định, sẽ sử dụng kết nối trước đó.

Mô tả

Hàm này sẽ string để chuyển mã các ký tự đặc biệt và考虑到连接的当前字符集,do đó có thể được sử dụng an toàn mysql_query().

Lưu ý và chú thích

Lưu ý:Bạn có thể sử dụng hàm này để ngăn chặn tấn công cơ sở dữ liệu.

Mô hình

Ví dụ 1

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
// Mã để lấy tên người dùng và mật khẩu
// Đổi mã tên người dùng và mật khẩu để sử dụng trong SQL
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
// Một số mã thêm
mysql_close($con);
?>

Ví dụ 2

Tấn công cơ sở dữ liệu. Ví dụ này minh họa điều gì sẽ xảy ra nếu chúng ta không áp dụng hàm mysql_real_escape_string() cho tên người dùng và mật khẩu:

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
$sql = "SELECT * FROM users
WHERE user='{$_POST['user']}'
AND password='{$_POST['pwd']}'";
mysql_query($sql);
// Không kiểm tra tên người dùng và mật khẩu
// Có thể là bất kỳ nội dung nào được nhập bởi người dùng, ví dụ:
$_POST['user'] = 'john';
$_POST['pwd'] = "' OR ''='";
// Một số mã...
mysql_close($con);
?>

Vậy truy vấn SQL sẽ trở thành như thế này:

SELECT * FROM users
WHERE user='john' AND password='' OR ''=''

Điều này có nghĩa là bất kỳ người dùng nào cũng không cần nhập mật khẩu hợp lệ để đăng nhập.

Ví dụ 3

Cách làm đúng để phòng ngừa tấn công cơ sở dữ liệu:

<?php
function check_input($value)
{
// Loại bỏ dấu gạch chéo
if (get_magic_quotes_gpc())
  {
  $value = stripslashes($value);
  }
// Nếu không phải số thì thêm dấu ngoặc kép
if (!is_numeric($value))
  {
  $value = "'" . mysql_real_escape_string($value) . "'";
  }
return $value;
}
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
// Thực hiện SQL an toàn
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";
mysql_query($sql);
mysql_close($con);
?>