Нужно ли экранировать подготовленные операторы PHP PDO? - PullRequest
19 голосов
/ 29 июня 2010

На PDO :: страница подготовки указано,

"и помогает предотвратить атаки SQL-инъекций, устраняя необходимость вручную заключать параметры в кавычки"

Зная это, есть ли функция PHP, такая как mysql_real_escape_string (), которая заботится о экранировании строк для PDO? Или ЗОП позаботится обо мне, чтобы сбежать?

EDIT

Теперь я понимаю, что задал неправильный вопрос. Мой вопрос на самом деле был: «О чем все заботится PDO для меня?» Что я понимаю теперь с этими ответами, что это действительно только устраняет необходимость избегать цитат. Но мне все равно нужно было бы делать любые другие вызовы очистки с помощью PHP для значений, которые я передаю в функцию execute. Такие как htmlentities (), strip_tags () ... и т.д ...

Ответы [ 5 ]

26 голосов
/ 29 июня 2010

PDO не экранирует переменные.Переменные и команда SQL передаются независимо через соединение MySQL.И токенайзер SQL (парсер) никогда не смотрит на значения .Значения просто дословно копируются в хранилище базы данных без возможности причинить какой-либо вред.Вот почему нет необходимости сортировать данные с помощью подготовленных операторов.

Обратите внимание, что это в основном преимущество в скорости.С помощью mysql_real_escape_string () вы сначала маршалируете свои переменные в PHP, а затем отправляете на сервер неэффективную команду SQL, которая должна снова дорого отделить фактическую команду SQL от значений.Вот почему часто говорят, что преимущество в безопасности является неявным, а не основной причиной использования PDO.

Если вы объединяете команду SQL и фактически не используете подготовленные инструкции (не хорошо!), Тогда да,для PDO по-прежнему есть escape-функция: $ pdo-> quote ($ string)

8 голосов
/ 29 июня 2010

Мало кто здесь понимает, что такое экранирование и когда его использовать.
Экранирование само по себе не делает никаких данных "безопасными".это просто экранирование, чтобы отличить разделитель от части данных.field = 'it's me' вызовет ошибку, а field = 'it\'s me' - нет.Это единственная цель побега.Таким образом, это работает только при использовании кавычек.Если нет - бегство становится бесполезным.

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

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

8 голосов
/ 29 июня 2010

Да и нет:

  • Литералы, которые вы встраиваете в строку оператора, должны экранироваться как обычно.
  • Значения, которые вы связываете с подготовленным оператором, обрабатываются библиотекой.
5 голосов
/ 29 июня 2010

Если вы готовите оператор и используете bindParam или bindValue для предоставления переменных, вам не нужно экранировать переменные.Обратите внимание, что эти функции предполагают, что переменная содержит строку, поэтому используйте третий параметр для bindValue, если вы хотите использовать логические значения или числа с плавающей запятой.

2 голосов
/ 29 июня 2010

Вам не нужно беспокоиться об этом. PDO не требует от вас экранирования данных перед их передачей в базу данных.

Редактировать: Просто чтобы прояснить, я хочу сказать, что пока вы передаете переменные в ваши параметры (например, значение поля формы), вам не нужно беспокоиться об этом. Однако, если вы передаете переменные, которые вы определили, например, как строки, то, очевидно, вам нужно избегать всего, что нужно экранировать в этой строке, чтобы избежать нарушения синтаксиса. Однако это даже не имеет особого смысла, поскольку одно из главных преимуществ PDO заключается в том, что вы передаете информацию от пользователя в базу данных без необходимости ее самостоятельной очистки, и таких случаев немного (если таковые имеются)? что вы будете передавать строки, которые вы сами определили.

Кроме того, убедитесь, что вы все еще обрабатываете данные для типа . Например, убедитесь, что это целое число, если вы ожидаете, что оно будет, убедитесь, что оно меньше или больше, чем x, если вы ожидаете, что оно будет, и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...