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