что действительно делает mysql_real_escape_string ()?

Одна вещь, которую я ненавижу по поводу документации в разы (когда вы новичок), – это то, как она на самом деле не описывает вещи на английском языке. Кто-нибудь мог бы перевести эту документацию для меня? Я хотел бы знать, как именно это усложняет хакеру вставлять символы.

http://php.net/manual/en/function.mysql-real-escape-string.php

Кроме того, если это так, как хакер попытается вставить символы?

Solutions Collecting From Web of "что действительно делает mysql_real_escape_string ()?"

Функция добавляет escape-символ, обратную косую черту, \, перед некоторыми потенциально опасными символами в строке, переданной функции. Вышедшие символы

\ x00, \ n, \ r, \, ', "и \ x1a.

Это может помочь предотвратить атаки SQL-инъекций, которые часто выполняются с использованием символа для добавления вредоносного кода в SQL-запрос.

Предположим, вы хотите сохранить строку. I'm a "foobar" в базе данных.
Ваш запрос будет выглядеть как INSERT INTO foos (text) VALUES ("$text") .
С заменой переменной $text это будет выглядеть так:

 INSERT INTO foos (text) VALUES ("I'm a "foobar"") 

Теперь, где точно заканчивается строка? Вы, возможно, знаете, SQL-парсер этого не делает. Мало того, что это просто нарушит этот запрос, его также можно использовать для ввода SQL-команд, которые вы не планировали.

mysql_real_escape_string гарантирует, что такие двусмысленности не возникают, экранируя символы, которые имеют особое значение для синтаксического анализатора SQL:

 mysql_real_escape_string($text) => I\'ma \"foobar\" 

Это становится:

 INSERT INTO foos (text) VALUES ("I\'ma \"foobar\"") 

Это делает заявление однозначным и безопасным. Сигнал \ сигнализирует, что следующий символ не должен восприниматься его особым значением в качестве ограничителя строк. Есть несколько таких символов, о mysql_real_escape_string заботится mysql_real_escape_string .

Escaping – довольно универсальная вещь в языках программирования BTW, все они одинаковы. Если вы хотите набирать приведенное выше предложение буквально на PHP, вам также нужно избегать его по тем же причинам:

 $text = 'I\'ma "foobar"'; // or $text = "I'm a \"foobar\""; 

Функция mysql_real_escape_string PHP является только оболочкой для функции mysql_real_escape_string MySQL . Он в основном готовит входную строку, которая должна быть безопасно использована в объявлении строки MySQL, путем экранирования определенных символов, чтобы они не могли быть неверно истолкованы как разделитель строк или разделитель последовательности escape-последовательности и, таким образом, допускать определенные атаки на инъекции .

Реальное в mysql_real_escape_string в противоположность mysql_escape_string связано с тем, что он также учитывает кодировку текущего символа, поскольку рискованные символы не кодируются одинаково в разных кодировках символов. Но вам нужно правильно изменить кодировку символов , чтобы заставить mysql_real_escape_string работать правильно.

Лучше всего объясняется здесь.

http://www.w3schools.com/php/func_mysql_real_escape_string.asp

http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

Как правило, это помогает избежать SQL-инъекции, например, рассмотреть следующий код:

 <?php // Query database to check if there are any matching users $query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'"; mysql_query($query); // We didn't check $_POST['password'], it could be anything the user wanted! For example: $_POST['username'] = 'aidan'; $_POST['password'] = "' OR ''='"; // This means the query sent to MySQL would be: echo $query; ?> 

и хакер может отправить запрос, например:

SELECT * FROM users WHERE user = 'aidan' AND password = '' OR '' = ''

Это позволит любому войти в систему без действительного пароля.

mysql_real_escape_string() помогает избежать специальных символов, таких как одинарная кавычка и т. Д., mysql_real_escape_string() пользователи могут отправлять на ваш скрипт. Вам нужно избегать таких символов, потому что это полезно, когда вы хотите избежать SQL Injection .

Я бы посоветовал вам проверить:

mysql_real_escape_string () по сравнению с подготовленными заявлениями

Чтобы быть на гораздо более безопасной стороне, вам нужно перейти на подготовленные заявления, как показано в предыдущей статье.

Функция mysqli_real_escape_string () пропускает специальные символы в строке для использования в инструкции SQL.