mysql_real_escape более одного раза
Мне просто интересно, имеет ли это значение, если я mysql_real_escape данных более одного раза?
Так что, если я экранировал данные в одной части моего сайта, а затем снова в другой части кода. Будет ли это проблемой? Или изменить ситуацию?
7 ответов
Правильное место для mysql_real_escape - прямо перед отправкой запроса на сохранение данных. Любой другой экземпляр где-либо еще в сценарии является серьезным недостатком дизайна.
Это должно быть предпочтительно в собственном DB-классе, конечно.
Да, это было бы проблемой.
Например:
если a - "Дом Джо", первый вызов создаст "Дом Джо", а второй вызовет "Дом Джо", сохраняя обратную косую черту в базе данных.
Это похоже на проблему, которая возникает, когда на веб-сервере включены магические кавычки и вы используете mysql_real_escape_string при вводе данных от клиента. Это решается путем:
if (! get_magic_quotes_gpc()) {
$value = mysql_real_escape_string($_GET["value"]);
} else {
$value = mysql_real_escape_string(stripslashes($_GET["value"]));
}
(Для последнего примера см. http://www.php.net/get_magic_quotes_gpc)
[Я отредактировал ответ, чтобы отразить исправления в комментариях ниже]
Невозможно различить экранированную и неэкранированную строку, потому что вещь, которая выглядит как экранированная строка, была предполагаемой неэкранированной строкой. Поэтому, попытка сбежать снова, ускользнет от побега - и текст с побегом один раз будет тем, что читает MySQL.
Поэтому вы никогда не должны убегать более одного раза.
Тем не менее, лучшим решением является использование параметризованных запросов, так как тогда вам вообще не нужно убегать.
Конечно, данные будут дважды экранированы.
Вы не должны использовать mysql_real_escape()
вообще, параметризованные запросы через mysqli задерживались достаточно долго.
Да, это будет проблема чрезмерного спуска. Это одинаково для любого побега, независимо от того, что именно он делает. Например, если вы хотите избежать двойных кавычек в строке, следуя общему правилу:
bla "foo"
после одного побега становится
bla \"foo\"
после двух становится
bla \\\"foo\\\"
и так далее. Количество "unescapements" должно точно соответствовать количеству "escapeings". Вы могли видеть проявления этой проблемы на некоторых сайтах, которые экранируют некоторые символы в текстовых полях, так что простой апостроф становится \'
на выходе.
Да, это имеет значение:
$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!