2015-04-22 3 views
-1

Учитывая это SQLПочему msyqli_real_escape_string() не позволяет избежать нескольких обратных косых черт?

UPDATE `mytable` 
SET `mycolumn`='karla bailey-pearapppppppp\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' 
WHERE `id`=5619 

Почему mysqli_real_escape_string() не избежать этой строки правильно?

Попытки использовать этот SQL запрос после побега значения столбца производит эту ошибку Mysqli:

«У Вас есть ошибка в вашем синтаксисе SQL, проверьте руководство, которое соответствует Вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать около '' karla bailey-pearapppppppp \\\\\\\\\\\\\\\\\\\\\ '' по строке 3 "

Есть ли предел числу которые можно избежать?

+1

Почему вы все еще используете mysqli_real_escape_string() и не используете переменные связывания .... тогда это было бы проблемой без проблем –

+4

, где и как реализуется это 'msyqli_real_escape_string()? в вашем вопросе нет ничего, чтобы поддержать это. btw, это 'mysqli_real_escape_string()', а не 'msyqli_real_escape_string()', так что если это то, что вы используете или нет; покажи это. –

+0

Похож, что ошибка между = и karla –

ответ

1

Хорошо, поэтому я нашел проблему. Приложение проверяет максимальную длину столбца>, а если значение слишком велико, усекает значение ПОСЛЕ того, как побег завершен, тем самым сломав экранированное значение (в очень изолированном случае, где это произошло, этот код был установлен на протяжении многих лет).

Ergo не может обрезать значение, которое заканчивается обратными косыми чертами после того, как значение уже экранировано.

2

Вы избегаете строки ENTIRE? например

$sql = "UPDATE .... \\\\\\\'"; 
$escaped = mysqli_real_escape_string($link, $sql); 

Если да, это неправильно. Вы обманываете строку, делая это. Вы также избегаете ', которые ограничивают ваше значение where where. Экранирование должно выполняться только VALUES, которое вы вставляете в строку. например

$name = "Miles O'Brien"; // ' in name would cause syntax error 
$bad_sql = "SELECT '$name'"; 
$broken_sql = mysqli_real_escape_string($link, $bad_sql); 
// produces: SELECT \'Miles O\'Brien\' 


$ok_sql = "SELECT '" . mysqli_real_escape_string($link, $name) . "'"; 
// produces: SELECT 'Miles O\'Brien'; 
+0

Хорошая уловка при фиксации их * надеюсь * Опечатка 'msyqli_real_escape_string' –

+0

Нет, я избегаю только значения. Теперь создадим образец сценария. –

+0

Я сбит с толку. Когда я пытаюсь сделать это за пределами приложения, это не подводит. Я могу полностью воспроизвести в приложении, вплоть до использования созданного мной тестового кода, который делает соединение, ускользает от строки, запускает запрос UPDATE. Сбой, когда я использую значение со страницы (через POST), но успешно, когда я использую то же значение в тестовом скрипте. Значение передается с использованием rawurlencode(), и поэтому в моем тестовом скрипте я использую кодированное значение, а затем используя rawurldecode(), но все равно работает каждый раз. –

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