Php экранировать кавычки mysql

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 ());

// Запрос
$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 »='» ;

// посылаем запрос, чтобы проверить имя и пароль пользователя
$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.

Источник

Читайте также:  Яркость для картинок css
Оцените статью