Как параметры SQL работают внутренне? - PullRequest
2 голосов
/ 07 октября 2009

Мы с коллегой просматривали SO, когда натолкнулись на вопрос об SQL-инъекции, и у нас возник вопрос: как внутренне работают параметризованные запросы? Выполняет ли используемый вами API (при условии, что он поддерживает параметризованные запросы) конкатенацию, объединяя запрос с параметрами? Или параметры попадают в механизм SQL отдельно от запроса, и конкатенация вообще не выполняется?

Google не очень помог, но, возможно, мы не искали нужную вещь.

Ответы [ 4 ]

5 голосов
/ 07 октября 2009

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

1 голос
/ 08 октября 2009

Я сомневаюсь, что SQL SERVER создает полную строку запроса из заданного параметризованного запроса, в котором список параметров объединяется.

Скорее всего, он анализирует заданную параметризованную командную строку, разбивая ее на внутреннюю структуру данных на основе зарезервированных слов и символов (SELECT, FROM, ",", "+" и т. Д.). В этой структуре данных есть свойства / места для значений, таких как имена таблиц, литералы и т. Д. Именно здесь он копирует (дословно) каждый передаваемый параметр (из списка) в соответствующий раздел этой структуры.

поэтому ваше @UserName значение: 'x'; удалить из пользователей -

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

1 голос
/ 07 октября 2009

Параметры поступают на сервер SQL в целости и сохраняются в индивидуальной «упаковке» с метаданными, указывающими их тип, будь то вход или выход и т. Д. Как указывает Алекс Рейтборт, так происходит потому, что параметризованные операторы являются концепцией уровня сервера, а не просто удобный способ вызова команд из разных слоев соединения.

0 голосов
/ 07 октября 2009

Параметры передаются вместе с запросом (не в запросе) и автоматически экранируются API при их отправке в соответствии с базовым протоколом связи с базой данных.

Например, у вас может быть

Query: <<<<select * from users where username = :username>>>>
Param: <<<<:username text<<<<' or '1' = '1>>>>>>>>

Это не точная кодировка, которую фактически использует любой протокол базы данных, но вы поняли идею.

...