array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'function.mysql-real-escape-string.php', 1 => 'mysql_real_escape_string', ), 'up' => array ( 0 => 'ref.mysql.php', 1 => 'MySQL', ), 'prev' => array ( 0 => 'function.mysql-query.php', 1 => 'mysql_query', ), 'next' => array ( 0 => 'function.mysql-result.php', 1 => 'mysql_result', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'reference/mysql/functions/mysql-real-escape-string.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string — Экранирует специальные символы в строках для использования в выражениях SQL
Данный модуль устарел начиная с версии PHP 5.5.0, и удалён в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API. Альтернативы для этой функции:
Экранирует специальные символы в unescaped_string
,
принимая во внимание кодировку соединения, таким образом, что результат
можно безопасно использовать в SQL-запросе в функции mysql_query().
Если вставляются бинарные данные, то к ним так же необходимо применять эту функцию.
mysql_real_escape_string() вызывает библиотечную функцию MySQL
mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам:
\x00
, \n
, \r
, \
,
'
, "
и \x1a
.
Эта функция должна всегда (за несколькими исключениями) использоваться для того, чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.
Кодировка символов должна устанавливаться как на сервере, так и с помощью функции mysql_set_charset(), чтобы влиять на поведение mysql_real_escape_string(). Подробнее описано в разделе кодировка символов.
unescaped_string
Экранируемая строка.
link_identifier
Соединение MySQL. Если идентификатор соединения не был указан,
будет использовано последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено,
функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров.
Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING
.
Возвращает строку, в которой экранированы все необходимые символы,
или false
в случае возникновения ошибки.
Запуск этой функции без существующего соединения с MySQL вызовет ошибку уровня
E_WARNING
. Данную функцию можно запускать только если есть
соединение с MySQL.
Пример #1 Простой пример использования mysql_real_escape_string()
<?php
// Соединение
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
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));
?>
Пример #2 Пример использования mysql_real_escape_string() без наличия соединения
Этот пример показывает, что произойдёт, если вызвать эту функцию без наличия соединения с MySQL.
<?php
// Коннекта к MySQL нет
$lastname = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
var_dump($_lastname);
var_dump($query);
?>
Вывод приведённого примера будет похож на:
Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5 Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5 bool(false) string(41) "SELECT * FROM actors WHERE last_name = ''"
Пример #3 Пример взлома с использованием SQL-инъекции
<?php
// Мы никак не проверили переменную $_POST['password'],
// а она может содержать совсем не то, что мы ожидали. Например:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// посылаем запрос, чтобы проверить имя и пароль пользователя
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);
// посмотрим, какой запрос будет отправлен в MySQL:
echo $query;
?>
Запрос, который будет отправлен в MySQL:
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
Это позволит кому угодно войти в систему без пароля.
Замечание:
Функцию mysql_real_escape_string() можно использовать только после того, как установлено соединение с MySQL. В противном случае возникнет ошибка уровня
E_WARNING
, а функция возвратитfalse
. Еслиlink_identifier
не указан, используется последнее открытое соединение.
Замечание:
Если не пользоваться этой функцией, то запрос становится уязвимым для взлома с помощью SQL-инъекций.
Замечание: mysql_real_escape_string() не экранирует символы
%
и_
. Эти знаки являются масками групп символов в операторах MySQLLIKE
,GRANT
иREVOKE
.