MySQL
PHP Manual

mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

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

Описание

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )

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

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " and \x1a.

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

Список параметров

unescaped_string

Строка, которая должна быть экранирована.

link_identifier

The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level error is generated.

Возвращаемые значения

Возвращает строку, в которой экранированы все необходимые символы, или FALSE в случае ошибки.

Примеры

Пример #1 Простой пример использования mysql_real_escape_string()

<?php

// Connect

$link mysql_connect('mysql_host''mysql_user''mysql_password')

    OR die(
mysql_error());



// Query

$query sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",

            
mysql_real_escape_string($user),

            
mysql_real_escape_string($password));

?>

Пример #2 Пример взлома с использованием SQL Injection

<?php

// посылаем запрос, чтобы проверить имя и пароль пользователя

$query "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";

mysql_query($query);



// Мы не никак проверили переменную $_POST['password'], 

// а она может содержать совсем не то, что мы ожидали. Например:

$_POST['username'] = 'aidan';

$_POST['password'] = "' OR ''='";



// посмотрим, какой запрос будет отправлен в MySQL:

echo $query;

?>

Запрос, который будет отправлен в MySQL:



SELECT * FROM users WHERE name='aidan' AND password='' OR ''=''

Это позволит кому угодно войти в систему без пароля.

Пример #3 Лучший вариант составления запроса

Применение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes.

<?php

// Функция экранирования переменных

function quote_smart($value)

{

    
// если magic_quotes_gpc включена - используем stripslashes

    
if (get_magic_quotes_gpc()) {

        
$value stripslashes($value);

    }

    
// Если переменная - число, то экранировать её не нужно

    // если нет - то окружем её кавычками, и экранируем

    
if (!is_numeric($value)) {

        
$value "'" mysql_real_escape_string($value) . "'";

    }

    return 
$value;

}



// Соединяемся

$link mysql_connect('mysql_host''mysql_user''mysql_password')

    OR die(
mysql_error());



// Составляем безопасный запрос

$query sprintf("SELECT * FROM users WHERE user=%s AND password=%s",

            
quote_smart($_POST['username']),

            
quote_smart($_POST['password']));



mysql_query($query);

?>

Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.

Примечания

Замечание: Функцию mysql_real_escape_string() можно использовать только после того, как установлено соединение с MySQL. В противном случае возникнет ошибка уровня E_WARNING, а функция возвратит FALSE. Если link_identifier не указан, используется последнее открытое соединение.

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

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

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

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


MySQL
PHP Manual