Почему использование подготовленного оператора mysql более безопасно, чем использование общих функций эвакуации?
В другом вопросе есть комментарий, в котором говорится следующее:
"Когда дело доходит до запросов к базе данных, всегда старайтесь использовать параметризованные запросы. В mysqli и Библиотеки PDO поддерживают это. Это бесконечно безопаснее, чем использование экранирования таких функций, как mysql_real_escape_string".
Источник
Итак, я хочу спросить: почему подготовленные параметризованные запросы более безопасны?
Ответы
Ответ 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, но легко забыть.
Ответ 5
Функция небезопасна из-за этого использования http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string. Вот почему подготовленные заявления являются предпочтительными, и это также улучшает производительность.
Ответ 6
Подготовленные утверждения решают фундаментальную проблему безопасности приложений, что простая санитария данных не делает: они приводят к полному разделению данных и инструкциям, Когда эти два путаются, результатом является отсутствие безопасности. Это справедливо для SQL-инъекций, а также для переполнения буфера.
(Есть и другие способы быть небезопасными.)
Ответ 7
Самый лучший случай, возможно, не так, но он по крайней мере безопасен; и зачем рисковать?