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 и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:

Описание

mysql_real_escape_string ( string $unescaped_string , resource $link_identifier = NULL ) : string

Экранирует специальные символы в 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 не указан, используется последнее открытое соединение.

Замечание:

Если magic_quotes_gpc включены, то сначала данные следует обработать функцией stripslashes(). Если данную функцию применить к уже проэкранированным данным, то данные будут проэкранированы дважды.

Замечание:

Если не пользоваться этой функцией, то запрос становится уязвимым для взлома с помощью SQL-инъекций.

Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT и REVOKE.

Смотрите также