2010-06-23 2 views
6

В настоящее время я использую расширение mysqli php.mysqli подготовленные операторы и mysqli_real_escape_string

Традиционно я использовал mysqli_real_escape_string, чтобы избежать ввода пользователем. Однако я рассматриваю возможность изменения кода (надеюсь, как можно меньше шагов) для использования подготовленных операторов.

Я хочу быть в курсе этого - если я использую подготовленные инструкции для привязки всех моих переменных, могу ли я быть уверенным, что SQL-инъекция невозможна? (И обойтись полностью с mysqli_real_escape_string?)

Благодаря

ответ

5

Если вы правильно связать все переменные, которые вы можете значительно уменьшить риск SQL инъекций. Это все еще возможно, чтобы получить инъекцию SQL, если вы создаете SQL динамически, например:

'SELECT * FROM ' . $tablename . ' WHERE id = ?' 

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

+0

Да, см. Http://www.sjmp.de/php/php-mysql-mehr-sicherheit-und-erhoehte-performance-durch-mysqli-und-prepared-statements/ для получения дополнительной информации – Tobias

4

Говоря о безопасности, нет разницы между обоими методами, если вы правильно привязываете или форматируете переменные.

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

Кроме того, имейте в виду, что никакая привязка и экранирование не могут сделать идентификатор безопасным. Итак, если вам нужно использовать имя поля или оператора в вашем запросе, вы должны использовать значение, жестко закодированное в вашем скрипте.

2

Вот мой высокий уровень зрения по этой теме.

При использовании динамических строк 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, я думаю, что всегда есть шанс, что еще не обнаруженная (или вновь созданная) ошибка сделает невозможным, возможно.

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