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, \, ',
" и \x1a.
Эта функция должна всегда (за несколькими исключениями) использоваться для того,
чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.
Список параметров
-
unescaped_string
-
Экранируемая строка.
-
link_identifier
-
Соединение MySQL. Если идентификатор соединения не был указан,
используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено,
функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров.
Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.
Возвращаемые значения
Возвращает строку, в которой экранированы все необходимые символы,
или FALSE в случае ошибки.
Примеры
Пример #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 Пример взлома с использованием 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.