Нужно ли использовать mysqli_real_escape_string
при повторном использовании данных из базы данных для запроса. Ранее данные были экранированы, поэтому их можно было безопасно вставить в базу данных. Я знаю, что при вставке данных в базу данных удаляются обратные слэши. Спасибо.Необходимость MySQL при вводе данных
ответ
Да, вы должны повторно использовать данные, которые поступали из БД при повторном использовании в другом запросе. Подумайте о том, чтобы убежать, чтобы быть эквивалентом подарочной упаковки на подарок. Вы «обертываете» некоторые данные для базы данных в одном запросе. Это приведет к 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: Вы можете легко вводить себя.
Спасибо за подробное объяснение и пример. – Tom
Это не то, что избегает.
Экранирование текста означает вставку escape-символов, чтобы его можно было вставить в строку SQL и интерпретироваться как исходный текст.
Это не влияет на фактическое значение, если вы не используете неправильные символы эвакуации.
Вам нужно правильно избежать текста каждый раз, когда вы объединяете его в любой структурированный язык.
При использовании SQL вы должны идеально использовать параметры вместо конкатенации.
Да, это необходимо. Эскапады используются только для синтаксически обоснованного запроса, они не являются частью данных, хранящихся в таблице. Каждый раз, когда вы интерполируете строки в запрос, вам нужно избежать этого.
В качестве примера предположим, что у вас есть таблица с полными именами, и есть кто-то с фамилией 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 ...
Это также, вероятно, будет более эффективным, так как данные не должны перемещаться между базой данных и приложением.
+1. [Это хороший ответ]: «... если вы используете подготовленные запросы *, которые используют заполнители в тексте SQL, и укажите значения с помощью переменных привязки *, вам не нужно ...». (Я видел примеры подготовленных операторов, которые включали значения в текст SQL, а не как переменные связывания. Я знаю, это тоже заставило меня содрогнуться.) – spencer7593
Не забудьте правильно проверить все введенные пользователем данные, которые вы планируете использовать, и не разрешать вставлять HTML-код или код javascript. Вы также должны иметь в виду атаки XSS, а не только инъекции MySQL. Хорошим способом предотвратить xss является использование htmlspecialchars() для преобразования HTML-символов в объекты HTML.
Проверка ввода не имеет ничего общего с форматированием SQL. –
Как валидация поможет, когда действительные данные могут содержать специальные символы? Имя, подобное O'Reilly, действительно, не так ли? – Barmar
Есть много недоразумений по этой теме.
Люди продолжают использовать неправильные слова и представляют собой реальную опасность, исходящую от такого замешательства.
избежать спутать с безопасности
данные спутать с строк
форматирования спутать с доверяя
One должны сортировать эти вопросы вне.
В противном случае у нас все еще есть принятый ответ, подразумевающий, что использование mysql_real_escape_string
действительно создает «безопасную» переменную. Пока это не так.
«Когда я использую слово, - сказал Шалтай-Болтай, довольно презрительным тоном, - это означает, что я хочу, чтобы это означало - ни больше, ни меньше». - Льюис Кэрролл, * Через зазеркалье *. – spencer7593
- 1. Необходимость восстановления данных MYSQL
- 2. Ошибка при вводе данных в сервер mysql
- 3. Строки MySQL удаляются при вводе данных
- 4. Ошибка Mysql при вводе абзаца
- 5. вопрос при вводе данных в базу данных
- 6. Ошибка при вводе INSERT в MySQL
- 7. Функция запуска при вводе данных
- 8. Дата Штамп при вводе данных
- 9. Ошибка при вводе данных даты
- 10. Валидация входных данных при вводе
- 11. excel зависает при вводе данных
- 12. Вложенные кавычки при вводе в MySql
- 13. ошибка при вводе нулевых данных в mysql phpmyadmin
- 14. Проблема с кодировкой PHP при вводе данных в mysql
- 15. Исключение при вводе даты в базу данных MySQL
- 16. Получение значения мусора при вводе данных в поле longtext MySql
- 17. Почему я получаю слэши при вводе данных в mysql?
- 18. PHP X MYSQL | Ошибка при вводе данных с использованием $ _POST
- 19. Удалить дополнительное пространство при вводе данных в mysql
- 20. MySQL: Ошибка при вводе новых данных с помощью идентификатора автоинкремента
- 21. Потеря данных при вводе специальных символов в MySql blob
- 22. Ошибка MYSQL при вводе данных с использованием php
- 23. Ошибка при вводе записи через узел в базу данных MySQL
- 24. Ошибка при вводе данных в MySQL с использованием Hibernate
- 25. Необходимость проверки блокировки MySQL
- 26. база данных заблокирована при вводе данных ios
- 27. Ошибка при вводе данных в базу данных
- 28. Проблемы при вводе двойного значения в MySQL
- 29. Необходимость отдельной базы данных
- 30. Необходимость подключения php и mysql
Покажите нам код. –
Я всегда использую mysqli и заполнители для всех моих значений, поэтому мне не нужно беспокоиться об экранировании, поскольку все это обрабатывается методом. – Drew
Чтобы показать данные, вы должны использовать htmlspecialchars() –