2010-05-16 8 views
-2

Мне просто интересно, имеет ли значение значение mysql_real_escape более одного раза?mysql_real_escape более одного раза

Так что, если я избежал данных в одной части моего сайта, а затем снова в другой части кода. Будет ли это проблемой? Или сделать разницу?

+9

Почему бы не просто попробовать и распечатать результат? –

+0

'mysql_real_escape_string' не является функцией идемпотента. – Gumbo

ответ

3

Да. Вы получите лишнюю ненужную обратную косую черту.

1

Конечно, данные будут двойными экранами.

Вы не должны использовать mysql_real_escape() вообще, параметризованные запросы через mysqli уже достаточно долго склеиваются.

+0

@ кто бы ни сказал это: объяснение было бы приятным. – Tomalak

1

Невозможно провести различие между экранированной и неизолированной строкой, потому что предмет, который выглядит как экранированная строка, представляет собой предполагаемую строку без сохранения. Поэтому, пытаясь сбежать снова, выйдет из экранирования - и текст с экранированным текстом будет тем, что читает MySQL.

Следовательно, вы никогда не должны избегать более одного раза.

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

2

Да, это была бы проблема.

Например:
если является «Дом Джо», первый вызов будет производить «Джо \«s House», а второй будет производить«Джо \\\»Дом S», сохраняя обратную косую черту в базе данных.

Это похоже на проблему, возникающую, когда веб-сервер активирован магическими кавычками, и вы используете 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)

[Я редактировал ответ, чтобы отразить поправки в комментариях ниже]

+0

Волшебные кавычки не выполняют те же экраны, что и mysql (i) _ (real) _escape string. Правильный способ обработки магических кавычек, если вы не можете их отключить, состоит в том, чтобы удалить их с помощью stripslashes, а затем при необходимости применить экранирование (т. Е. Если вы не можете использовать параметризованные запросы). В идеале вы должны избавиться от магических котировок в самом начале, чтобы избежать необходимости разбивать их каждый раз, когда вам нужно выводить их в контексте, отличном от DB. –

+0

Я не буду ниспровергать из-за вашей оценки, но этот подход неверен. Escaping должен быть просто '$ value = mysql_real_escape_string ($ _ GET [" value "]); ** безусловный **. И избавление от магических кавычек - это еще один вопрос, который нужно сделать задолго до составления запроса, на самом верху скрипта. –

+0

Мне нужно будет опустить вас, если вы не делаете '$ value = mysql_real_escape_string (stripslashes ($ _ GET [" value "]));' в последнем условии. –

1

Да, это будет более-спусковое проблема. Это то же самое для любого выхода, независимо от того, что именно он делает. Например, если вы хотите избежать двойные кавычки в строке следующее общее правило:

bla "foo" 

после того, как один маскирование становится

bla \"foo\" 

после двух становится

bla \\\"foo\\\" 

и так далее. Количество «unescapements» должно точно соответствовать количеству «сбрасываний». Вы могли видеть проявления этой проблемы на некоторых сайтах, которые превосходят некоторые символы в текстовых полях, так что простой апостроф становится \' на выходе.

0

Да, это имеет значение:

$string = "I'm Chuck!"; 
mysql_escape_string($string); // I\'m Chuck! 
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck! 
8

Подходящее место для mysql_real_escape является перед вы посылаете запрос для сохранения данных. Каждый другой экземпляр в другом месте скрипта является основным недостатком дизайна.

Это должно быть предпочтительно в собственном классе db, конечно.

+0

Величайший момент! Я должен был это отметить сам. –

+0

Это подходящее место для этого, но не лучший способ справиться с этой проблемой. –

+0

@Blair помочь объяснить немного? Какая проблема и что лучше? –

Смежные вопросы