2011-01-03 6 views
1

Во-первых магические цитаты & время работы отключено правильно в php.ini и подтверждено phpinfo().mysql_real_escape_string & slashes

PHP version: 5.3.4 
MySQL version: 5.1.52 

Я только с помощью mysql_real_escape_string по данным, после htmlspecialchars и trim, это все данные для очистки от переменной.

Однако, когда я отправляю одну цитату, косая черта остается в базе данных.

При работе mysql_query Я использую "' . $var . '", хотя в прошлом это ничего не изменило (может быть, из-за двойных кавычек?).

Любые идеи? и, пожалуйста, не говорите мне о PDO/подготовленных заявлениях, я знаю о них, и у меня есть причины для этого.

Спасибо!

пример кода (это единственное, что нужно сделать данные):

mysql_real_escape_string(htmlspecialchars(trim($data))); 
+2

Вы можете показать некоторые данные и код примера? –

+0

Чтобы вы знали, mysql_real_escape_string ничего не чистит. Это вовсе не «чистка». Go figure –

+1

Не могли бы вы дать фрагмент кода, возможно, намного легче определить проблему. @Col. Шрапнель: Ну, это ускользает от специальных символов, которые можно было бы назвать «очищающим» процессом, угадайте, что это вопрос интерпретации, но –

ответ

3

Я использую только mysql_real_escape_string на данных, после htmlspecialchars и аккуратным, что это все данные уборки на переменная.

No. Только использование mysql_real_escape_string для хранения данных в базе данных. Не мешайте данным при его хранении.

Функция htmlspecialchars используется для кодирования строки в HTML (< становится &lt; и т. Д.), И ее следует использовать только для этой цели.

+1

Это правильный взгляд, но на самом деле не ответ на его вопрос, не так ли? –

+0

Тогда вы должны помнить, что нужно санировать его с помощью htmlentities, когда вы возвращаете его из базы данных и хотите отображать данные на переднем конце ... –

+0

@Pekka это ответ. Если кто-то делает этот путь и имеет магические цитаты в реальности, у них нет ни одной проблемы с косой чертой. –

1

Возможно массово ошибочный, бесполезен и разрушительный вариант

magic_quotes_gpc 

Был включен?

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

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

Затем зайдите в дом администратора сервера с дробящим оружием по вашему выбору.

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

+2

Он утверждает, что он выключен. –

+0

Это не работает. Я запускаю сервер, и он определенно отключен, я бы не допустил этого мусора. – Fizzadar

1

Ваша процедура хранения правильная. (altough htmlspecialchars и/или отделка, вероятно, не нужны, но я не знаю о вашей заявке)

Из информации, которую вы предоставляете, нет причин для решения вашей проблемы.

следующий подход отладки затем будет помнить, что бы вы ни изменили или не были изменены в вашей системе (например, вы используете какой-то сторонний установочный образ?).

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

MySQL может быть запущен в NO_BACKSLASH_ESCAPES -mode, что приведет к люфтов должны рассматриваться как обычные символы.

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

Возможно, также возможно, что - поскольку вы завершаете свои строки двойными кавычками внутри своих операторов sql, что не так, как должно быть, и я сбитый с толку, вы не получаете ошибку нарушения синтаксиса, вы в конечном итоге с каким-то запросом вроде "john\'s house", который вызван выводом одиночной кавычки из mysql_real_escape, что было бы правильно, если бы ваш запрос был правильно завершен одиночными кавычками.

, который приводит меня к вопросу. вы получаете синтаксическую ошибку (или введенный запрос) при попытке вставить двойные кавычки?

что касается вашего комментария. вы можете очень хорошо подготовить заявления с pdo и затем получить строку запроса из формы и выполнить их с помощью функций mysql. однако я понимаю, что это не решение вашей проблемы.

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

+0

+1 для предложения NO_BACKSLASH_ESCAPES. –

0

Если вы используете двойные кавычки в командует SQL бежав данные:

SELECT "1\'2" 

тогда он будет хранить и возвращать значение как 1\'2 с обратной косой черты остаются нетронутыми.

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

Использование двойных кавычек в PHP. Используйте одинарные кавычки для SQL. Внесите свой код так:

$x = escapy($x); 
$y = escapy($y); 
sql_query("INSERT INTO tbl (x,y) VALUES ('$x', '$y')"); 
+0

'SELECT '1 \' 2" 'возвращает' 1'2' для меня - без обратной косой черты. –

+0

@MarkByers: не проверено с помощью My. Просто попробовал SQLite, который демонстрирует такое поведение. И все же кажется, скорее всего, его единственным фрагментом кода. – mario