2013-07-26 3 views
0

Нужно ли использовать mysqli_real_escape_string при повторном использовании данных из базы данных для запроса. Ранее данные были экранированы, поэтому их можно было безопасно вставить в базу данных. Я знаю, что при вставке данных в базу данных удаляются обратные слэши. Спасибо.Необходимость MySQL при вводе данных

+0

Покажите нам код. –

+0

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

+0

Чтобы показать данные, вы должны использовать htmlspecialchars() –

ответ

5

Да, вы должны повторно использовать данные, которые поступали из БД при повторном использовании в другом запросе. Подумайте о том, чтобы убежать, чтобы быть эквивалентом подарочной упаковки на подарок. Вы «обертываете» некоторые данные для базы данных в одном запросе. Это приведет к UNWRAP данным и поместит их в хранилище данных. Когда вы снова загрузите эти данные, обертка исчезнет, ​​а данные будут «опасными» снова.

например.рассмотреть что-то вроде этого:

$name = "Miles O'Brien"; 
$safe = mysql_real_escape_string($name); // name becomes Miles O\'Brien 
$sql = "INSERT INTO people (names) VALUES '$safe'"; 
$result = mysql_query($sql) or die(mysql_error()); 

Теперь это имя в базе данных, но спасаясь вы выполнили нет больше - она ​​была удалена с помощью базы данных, как она обрабатывается запрос, так что если вы делаете что-то вроде этого:

$sql = "SELECT name FROM people" 
$result = mysql_query($sql) or die(mysql_error()); 
while($row = mysql_fetch_asssoc($result)) { 
    $name = $row['name']; // get Miles O'Brien from the DB again 

здесь вы буквально получите Miles O'Brien без каких-либо вылета.

$other_sql = "UPDATE ... WHERE name=$name"; <---INJECTION HERE 
} 

Мнемонизация не то, что вы делаете только с «внешними» данных ... ANY данные вы вставляете в строку запроса является «вне» данных, даже если вы только что получили, что данные из базы данных только несколько строк кода назад.

TL; DR: Вы можете легко вводить себя.

+0

Спасибо за подробное объяснение и пример. – Tom

1

Это не то, что избегает.

Экранирование текста означает вставку escape-символов, чтобы его можно было вставить в строку SQL и интерпретироваться как исходный текст.
Это не влияет на фактическое значение, если вы не используете неправильные символы эвакуации.

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

При использовании SQL вы должны идеально использовать параметры вместо конкатенации.

3

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

В качестве примера предположим, что у вас есть таблица с полными именами, и есть кто-то с фамилией O'Reilly. Вы выполняете запрос, чтобы получить это имя в $lname, а затем вы хотите использовать эту переменную в другом запросе, например.

$query = "SELECT username WHERE last_name = '$lname'"; 

Если вы не избежать строки, то результирующий запрос будет:

SELECT username WHERE last_name = 'O'Reilly' 

Как вы можете видеть, котировки не сбалансированы. Вам нужно бежать так, что это будет:

SELECT username WHERE last_name = 'O\'Reilly' 

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

Кроме того, рассматривать не извлекая и повторного хранения данных на всех, но перемещение данных вокруг использования самого SQL:

INSERT INTO Table1 (last_name) 
SELECT last_name 
FROM Table2 
WHERE ... 

Это также, вероятно, будет более эффективным, так как данные не должны перемещаться между базой данных и приложением.

+0

+1. [Это хороший ответ]: «... если вы используете подготовленные запросы *, которые используют заполнители в тексте SQL, и укажите значения с помощью переменных привязки *, вам не нужно ...». (Я видел примеры подготовленных операторов, которые включали значения в текст SQL, а не как переменные связывания. Я знаю, это тоже заставило меня содрогнуться.) – spencer7593

-2

Не забудьте правильно проверить все введенные пользователем данные, которые вы планируете использовать, и не разрешать вставлять HTML-код или код javascript. Вы также должны иметь в виду атаки XSS, а не только инъекции MySQL. Хорошим способом предотвратить xss является использование htmlspecialchars() для преобразования HTML-символов в объекты HTML.

+0

Проверка ввода не имеет ничего общего с форматированием SQL. –

+0

Как валидация поможет, когда действительные данные могут содержать специальные символы? Имя, подобное O'Reilly, действительно, не так ли? – Barmar

0

Есть много недоразумений по этой теме.

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

избежать спутать с безопасности
данные спутать с строк
форматирования спутать с доверяя

One должны сортировать эти вопросы вне.
В противном случае у нас все еще есть принятый ответ, подразумевающий, что использование mysql_real_escape_string действительно создает «безопасную» переменную. Пока это не так.

+0

«Когда я использую слово, - сказал Шалтай-Болтай, довольно презрительным тоном, - это означает, что я хочу, чтобы это означало - ни больше, ни меньше». - Льюис Кэрролл, * Через зазеркалье *. – spencer7593

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