Вот мой высокий уровень зрения по этой теме.
При использовании динамических строк SQL вы полагаетесь на функцию эвакуации, которая работает правильно. К сожалению, это не всегда так, как это можно видеть в этом (по общему признанию, старый), например:
http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html
После того, как ваши значения данных были спасся, строка SQL должна быть разобранной и скомпилированной в базе данных сервер. Если функция экранирования не выполнила свою работу должным образом или обнаружена умная новая атака SQL-инъекций, есть вероятность, что сервер будет ошибочно принимать данные для операторов SQL.
Если вы используете подготовленные операторы с параметрами, оператор сначала разбирается и компилируется. Значения данных объединяются с компилируемым оператором при его выполнении. Это отделяет логику SQL от значений данных - возможность путать два так, чтобы никогда не возникало.
Итак, да, вы можете обойтись без mysqli_real_escape_string
, но я бы не стал заходить так далеко, чтобы сказать, что использование подготовленных операторов с параметрами делает невозможным SQL-инъекцию. Это делает его значительно сложнее, но, как и в случае с ошибкой mysqli_real_escape_string
, я думаю, что всегда есть шанс, что еще не обнаруженная (или вновь созданная) ошибка сделает невозможным, возможно.
Да, см. Http://www.sjmp.de/php/php-mysql-mehr-sicherheit-und-erhoehte-performance-durch-mysqli-und-prepared-statements/ для получения дополнительной информации – Tobias