PHP mysql_real_escape_string() функция

Определение и использование

Функция mysql_real_escape_string() эскапирует особые символы в строках, используемых в SQL-запросах.

Следующие символы受到影响:

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

Если функция успешна, она возвращает эскапированную строку. Если функция失败了, она возвращает false.

Синтаксис

mysql_real_escape_string(string,connection)
Параметры Описание
string Обязательно. Определяет строку, которую нужно эскапировать.
connection Опционально. Определяет соединение MySQL. Если не указано, используется предыдущее соединение.

Описание

Эта функция string в специальных символах и учитывая текущий набор символов подключения, поэтому может быть безопасно использован для mysql_query().

Советы и комментарии

Совет:Эта функция может быть использована для предотвращения атак на базу данных.

Пример

Пример 1

<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
// Код для получения имени пользователя и пароля
// Эскапирование имени пользователя и пароля для использования в SQL
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = "SELECT * FROM users WHERE
user='" . $user . "' AND password='" . $pwd . "'"
// Дополнительный код
mysql_close($con);
?>

Пример 2

Атака на базу данных. Этот пример демонстрирует, что произойдет, если мы не применяем функцию mysql_real_escape_string() к имени пользователя и паролю:

<?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);
// Проверка имени пользователя и пароля не выполняется
// Это может быть любая введенная пользователем информация, например:
$_POST['user'] = 'john';
$_POST['pwd'] = '" OR ''='";
// Некоторые коды...
mysql_close($con);
?>

Тогда SQL-запрос будет выглядеть так:

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;
}
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
// Выполнение безопасного SQL
$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);
?>