Эмулированные готовые высказывания против реально подготовленных высказываний

В чем разница между двумя видами подготовленных заявлений?

Я думаю, что реально подготовленные операторы требуют поддержки на стороне сервера, которая принимает параметры после анализа и компиляции схемы / шаблона кода SQL, и, я полагаю, это то, что гарантирует нам защиту от SQL-инъекций.

В случае эмулированных подготовленных операторов, без поддержки сервера, что делает
это гарантирует нам от этого?

2 ответа

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

Первый шаг заключается в отправке шаблона запроса, который сервер может предварительно скомпилировать. Механизм базы данных также заранее готовит план выполнения (в основном, какие индексы будут использоваться для обслуживания фактического запроса).

Вторым шагом является предоставление фактических значений местозаполнителям и выполнение фактического запроса с этими параметрами.

Как правило, это позволяет быстрее выполнять несколько похожих запросов, потому что: 1. запрос уже был предварительно скомпилирован (план выполнения уже рассчитан) и 2. впоследствии отправляются только значения параметров.

Эмулируемый запрос - это всего лишь синтаксический сахар, который позволяет легче отправлять (но не ускорять выполнение) несколько последовательных похожих запросов. Полные операторы SQL отправляются на сервер каждый раз, когда выполняется эмулируемый запрос.

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

Что в случае эмулированных подготовленных заявлений без поддержки сервера, что это гарантирует нам от этого?

Это хороший вопрос.

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

Основная идея подготовленного оператора состоит в том, чтобы сделать литерал данных обработанным должным образом и сделать такую ​​обработку неизбежной. Хотя детали такой обработки не так важны.

Основная проблема с внедрением SQL заключается в том, что он не существует сам по себе. Вся "опасность" исходит только из неправильно отформатированного запроса. Каждый раз, когда вы видите инъекционный регистр, вы найдете неправильно отформатированный литерал в качестве причины.

Пока правильно отформатированный запрос уже защищен.

Вот почему нужно позаботиться об отсутствии инъекций, а только о правильном форматировании.
Так подготовленное заявление делает такое форматирование, так или иначе.

Это все.

Другие вопросы по тегам