mysql_real_escape_string
(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.
Альтернативы для этой функции:
Описание
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() не экранирует символы
%
и _
. Эти знаки являются масками
групп символов в операторах MySQL LIKE
,
GRANT
и REVOKE
.