PHP PDO подготовился, операторов нужно оставить?

На PDO:: Подготовьте страницу, которую это указывает,

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

Знание этого, там функция PHP как mysql_real_escape_string (), который заботится о выходе из жал для PDO? Или PDO заботится обо всем выходе для меня?

Править

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

19
задан Cœur 10 September 2017 в 06:31
поделиться

5 ответов

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

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

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

26
ответ дан 30 November 2019 в 02:38
поделиться

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

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

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

2
ответ дан 30 November 2019 в 02:38
поделиться

Да и нет:

  • Литералы, которые вы вставляете в строку оператора, нужно экранировать как обычно.
  • Значения, которые вы привязываете к подготовленному оператору, обрабатываются библиотекой.
8
ответ дан 30 November 2019 в 02:38
поделиться

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

5
ответ дан 30 November 2019 в 02:38
поделиться

Очень немногие здесь понимают, что такое экранирование и когда его использовать.
Само по себе экранирование не делает данные «безопасными». Он просто избегает разделителей, чтобы отличить разделитель от части данных. field = 'это я' вызовет ошибку, а field = 'it \' s me ' - нет. Это единственная цель побега. Итак, это работает только при использовании кавычек. Если нет - убегать становится бесполезно.

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

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

9
ответ дан 30 November 2019 в 02:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: