Подтвердить что ты не робот

Почему использование подготовленного оператора mysql более безопасно, чем использование общих функций эвакуации?

В другом вопросе есть комментарий, в котором говорится следующее:

"Когда дело доходит до запросов к базе данных, всегда старайтесь использовать параметризованные запросы. В mysqli и Библиотеки PDO поддерживают это. Это бесконечно безопаснее, чем использование экранирования таких функций, как mysql_real_escape_string".

Источник

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

4b9b3361

Ответ 1

Важным моментом, который, как мне кажется, здесь является отсутствие людей, является то, что с базой данных, которая поддерживает параметризованные запросы, нет необходимости "сбегать". Механизм базы данных не объединяет связанные переменные в оператор SQL, а затем анализирует все это; Связанные переменные сохраняются отдельно и никогда не анализируются как общий оператор SQL.

То, откуда берется безопасность и скорость. Механизм базы данных знает, что заполнитель содержит только данные, поэтому он никогда не анализируется как полный оператор SQL. Ускорение происходит, когда вы готовите выражение один раз, а затем выполняете его много раз; канонический пример - вставка нескольких записей в одну и ту же таблицу. В этом случае движок базы данных должен анализировать, оптимизировать и т.д. Только один раз.

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

Ответ 2

Во-первых, вы оставляете экранирование опасных символов в базе данных, что намного безопаснее, чем вы, человек.

... он не забудет бежать или пропустить какие-либо специальные символы, которые могут быть использованы для инъекции какого-то вредоносного SQL. Не говоря уже о том, что вы можете повысить производительность для загрузки!

Ответ 3

Я не очень разбираюсь в безопасности, но вот объяснение, которое, я надеюсь, поможет вам:

Скажем, у вас есть выражение вроде:

выберите [integer] из mydb

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

           01                  00 00                  23
Opcode for select          Prepared bytes      number of "mydb"
                          for your integer

Теперь, когда вы выполните, вы введете номер в пространство, зарезервированное для вашего подготовленного оператора.

Сравните это с тем, если вы просто используете escape, вы можете вставить туда столько тарабарщин и, возможно, привести к переполнению памяти или к какой-либо команде bizzare sql, которую они забыли избежать.

Ответ 4

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

mysql_real_escape_string так же безопасен, как и подготовленные инструкции, если вы не забудете использовать mysql_real_escape_string каждый раз, когда вы вызываете mysql_query, но легко забыть.

Ответ 6

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

(Есть и другие способы быть небезопасными.)

Ответ 7

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