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
] )
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.
|
|