- mysql_real_escape_string
- Описание
- Безопасность: кодировка символов по умолчанию
- Список параметров
- Возвращаемые значения
- Примеры
- Примечания
- Смотрите также
- mysqli_real_escape_string
- Описание
- Безопасность: набор символов по умолчанию
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 7 notes
mysql_real_escape_string
Данное расширение устарело, начиная с версии PHP 5.5.0, и будет удалено в будущем. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:
Описание
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )
Экранирует специальные символы в 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() . Подробнее описано в разделе кодировка символов.
Список параметров
Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect() . Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING .
Возвращаемые значения
Возвращает строку, в которой экранированы все необходимые символы, или FALSE в случае ошибки.
Примеры
Пример #1 Простой пример использования mysql_real_escape_string()
// Соединение
$link = mysql_connect ( ‘mysql_host’ , ‘mysql_user’ , ‘mysql_password’ )
OR die( mysql_error ());
?php
// Запрос
$query = sprintf ( «SELECT * FROM users WHERE user=’%s’ AND password=’%s'» ,
mysql_real_escape_string ( $user ),
mysql_real_escape_string ( $password ));
?>
Пример #2 Пример взлома с использованием SQL-инъекции
// Мы не никак проверили переменную $_POST[‘password’],
// а она может содержать совсем не то, что мы ожидали. Например:
$_POST [ ‘username’ ] = ‘aidan’ ;
$_POST [ ‘password’ ] = «‘ OR »='» ;
?php
// посылаем запрос, чтобы проверить имя и пароль пользователя
$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.
Смотрите также
- mysql_set_charset() — Устанавливает кодировку клиента
- mysql_client_encoding() — Возвращает кодировку соединения
- addslashes() — Экранирует строку с помощью слешей
- stripslashes() — Удаляет экранирование символов
- Директива magic_quotes_gpc
- Директива magic_quotes_runtime
mysqli_real_escape_string
mysqli::real_escape_string — mysqli::escape_string — mysqli_real_escape_string — Экранирует специальные символы в строке для использования в SQL-выражении, используя текущий набор символов соединения
Описание
Эта функция используется для создания допустимых в SQL строк, которые можно использовать в SQL выражениях. Заданная строка кодируется для создания экранированной строки SQL с учётом текущего набора символов подключения.
Безопасность: набор символов по умолчанию
Набор символов должен быть задан либо на стороне сервера, либо с помощью API-функции mysqli_set_charset() . В противном случае mysqli_real_escape_string() работать не будет. За дополнительной информацией обращайтесь к документации наборы символов.
Список параметров
Только для процедурного стиля: объект mysqli , полученный с помощью mysqli_connect() или mysqli_init() .
Строка, которую требуется экранировать.
Экранируемые символы NUL (ASCII 0), \n, \r, \, ‘, «, и Control-Z .
Возвращаемые значения
Возвращает экранированную строку.
Примеры
Пример #1 Пример использования mysqli::real_escape_string()
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );
/* этот запрос с экранированным $city будет работать */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» ,
$mysqli -> real_escape_string ( $city ));
$result = $mysqli -> query ( $query );
printf ( «Возвращённые строки: %d.\n» , $result -> num_rows );
/* этот запрос завершится ошибкой, потому что мы не экранировали $city */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» , $city );
$result = $mysqli -> query ( $query );
mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );
/* этот запрос с экранированным $city будет работать */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» ,
mysqli_real_escape_string ( $mysqli , $city ));
$result = mysqli_query ( $mysqli , $query );
printf ( «Возвращённые строки: %d.\n» , mysqli_num_rows ( $result ));
/* этот запрос завершится ошибкой, потому что мы не экранировали $city */
$query = sprintf ( «SELECT CountryCode FROM City WHERE name=’%s'» , $city );
$result = mysqli_query ( $mysqli , $query );
Результатом выполнения данных примеров будет что-то подобное:
Возвращённые строки: 1. Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's-Hertogenbosch'' at line 1 in.
Смотрите также
User Contributed Notes 7 notes
You can avoid all character escaping issues (on the PHP side) if you use prepare() and bind_param(), as an alternative to placing arbitrary string values in SQL statements. This works because bound parameter values are NOT passed via the SQL statement syntax.
Note that this function will NOT escape _ (underscore) and % (percent) signs, which have special meanings in LIKE clauses.
As far as I know there is no function to do this, so you have to escape them yourself by adding a backslash in front of them.
Presenting several UTF-8 / Multibyte-aware escape functions.
These functions represent alternatives to mysqli::real_escape_string, as long as your DB connection and Multibyte extension are using the same character set (UTF-8), they will produce the same results by escaping the same characters as mysqli::real_escape_string.
This is based on research I did for my SQL Query Builder class:
https://github.com/twister-php/sql
/**
* Returns a string with backslashes before characters that need to be escaped.
* As required by MySQL and suitable for multi-byte character sets
* Characters encoded are NUL (ASCII 0), \n, \r, \, ‘, «, and ctrl-Z.
*
* @param string $string String to add slashes to
* @return $string with `\` prepended to reserved characters
*
* @author Trevor Herselman
*/
if ( function_exists ( ‘mb_ereg_replace’ ))
function mb_escape ( string $string )
return mb_ereg_replace ( ‘[\x00\x0A\x0D\x1A\x22\x27\x5C]’ , ‘\\\0’ , $string );
>
> else function mb_escape ( string $string )
return preg_replace ( ‘~[\x00\x0A\x0D\x1A\x22\x27\x5C]~u’ , ‘\\\$0’ , $string );
>
>
?>
Characters escaped are (the same as mysqli::real_escape_string):
00 = \0 (NUL)
0A = \n
0D = \r
1A = ctl-Z
22 default»>
/**
* Returns a string with backslashes before characters that need to be escaped.
* As required by MySQL and suitable for multi-byte character sets
* Characters encoded are NUL (ASCII 0), \n, \r, \, ‘, «, and ctrl-Z.
* In addition, the special control characters % and _ are also escaped,
* suitable for all statements, but especially suitable for `LIKE`.
*
* @param string $string String to add slashes to
* @return $string with `\` prepended to reserved characters
*
* @author Trevor Herselman
*/
if ( function_exists ( ‘mb_ereg_replace’ ))
function mb_escape ( string $string )
return mb_ereg_replace ( ‘[\x00\x0A\x0D\x1A\x22\x25\x27\x5C\x5F]’ , ‘\\\0’ , $string );
>
> else function mb_escape ( string $string )
return preg_replace ( ‘~[\x00\x0A\x0D\x1A\x22\x25\x27\x5C\x5F]~u’ , ‘\\\$0’ , $string );
>
>
?>
Additional characters escaped:
The original MySQL `utf8` character-set (for tables and fields) only supports 3-byte sequences.
4-byte characters are not common, but I’ve had queries fail to execute on 4-byte UTF-8 characters, so you should be using `utf8mb4` wherever possible.
However, if you still want to use `utf8`, you can use the following function to replace all 4-byte sequences.