Экранирует специальные символы в строках для использования в выражениях SQL

# 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. Альтернативы для этой функции:

- mysqli_real_escape_string()
- PDO::quote()

### Описание

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

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

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

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

- mysql_set_charset() - Устанавливает кодировку клиента
- mysql_client_encoding() - Возвращает кодировку соединения

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open