Значение экранируется с помощью mysql_real_escape_string () перед вставкой в ​​базу данных, но сохраненное значение не экранируется - PullRequest
0 голосов
/ 26 августа 2011

Я читал в некоторых уроках / примере, что эта функция сохранит в базе данных

<a href="http://foo.com">foo</a>

в

<a href=\"http://foo.com\">foo</a>

В моем случае (у меня есть magic_quotes, как предлагают многие люди),

$text = mysql_real_escape_string($_POST['text']);
$sql="INSERT INTO test (text) VALUES ('$text')";

сохраняется как <a href="http://foo.com">foo</a> в БД, которую я вижу через phpMyAdmin.

Полагаю, это из-за magic_quotes, потому что когда они были у меня, он был сохранен как <a href=\"http://foo.com\">foo</a>.

С отключенным magic_quotes и моим примером выше, я защищен от SQL-инъекций?

Ответы [ 3 ]

2 голосов
/ 26 августа 2011

Смысл экранирования - сделать двусмысленный синтаксис однозначным.

INSERT INTO test (text) VALUES ("<a href="http://foo.com">foo</a>")

Это неоднозначно / неправильно, потому что база данных не может сказать, следует ли буквально воспринимать " внутри " или они указывают конец строки, которую вы хотите поместить в базу данных. Обратите внимание, что здесь, на SO, также обломана подсветка синтаксиса. mysql_real_escape_string избегает этого до:

INSERT INTO test (text) VALUES ("<a href=\"http://foo.com\">foo</a>")

Это теперь однозначно, внутренний " do not сигнализирует конец строки.

Это единственное, что делает escape, он не навсегда вставляет обратную косую черту в строку.

Пожалуйста, прочитайте Великий эскапизм (или: что нужно знать, чтобы работать с текстом внутри текста) .

2 голосов
/ 26 августа 2011

mysql_real_escape_string спасет вас от инъекций sql в строки. Это альтернатива addlashes (). Если вы посмотрите на addlashes, вы увидите, что это то, что делает magic_quotes. Он просто вызывает addlashes автоматически для различных источников ввода. mysql_real_escape_string лучше использовать с mysql, потому что он знает об используемых наборах символов mysql и экранирует дополнительные символы, специфичные для диалекта SQL mysql.

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

Как указывалось ранее, лучшим предупреждением является использование mysqli или pdo, а не mysql, и использование переменных связывания. Такой подход непроницаем для всех вопросов внедрения SQL.

1 голос
/ 26 августа 2011

Смысл использования mysql_real_escape_string состоит в том, чтобы экранировать символы для вашего запроса, поэтому то, что вы видите в своей базе данных, является правильным (в противном случае, если вы используете SQL SELECT, это даст вам строку с обратными слешами).

Итак, ваш запрос выглядит так: INSERT INTO test (text) VALUES ("<a href=\"http://foo.com\">foo</a>"), который вставляет его в текстовый столбец как <a href="http://foo.com">foo</a>.

\ - это просто для запроса mysql, что вы используете символ " вместо закрытия строки. Когда у вас есть волшебные кавычки, это все равно, что дважды * * * * * * * * * * * * * * * * '' сделать '' дважды в переменной '*. Вот почему magic_quotes устарела и должна быть отключена. Это небезопасно и оставляет вас открытым для атаки.

Чтобы ответить на ваш вопрос, отключив магические кавычки и используя mysql_real_escape_string, вы защищены от внедрения SQL

...