Что на самом деле делает SqlCommand.Parameters.AddWithValue? - PullRequest
3 голосов
/ 14 июля 2010

Что меняется SqlCommand.Parameters.AddWithValue() с запросом?

Я ожидаю, что:

  1. Он заменяет каждый символ ' на '',

  2. Если значение параметра является строкой или чем-то, что должно быть преобразовано в строку, оно окружает значение ', поэтому, например, select * from A where B = @hello даст select * from A where B = 'hello world'.

  3. Если значение параметра является чем-то «безопасным», как целое число, оно вставляется в запрос как есть, без кавычек, поэтому select * from A where B = @one даст select * from A where B = 1.

Есть ли другие изменения, о которых я не знаю?

Ответы [ 2 ]

7 голосов
/ 14 июля 2010

Драйвер ADO.NET SqlClient не сделает любые замены!Это распространенное заблуждение - оно позволяет избежать проблем с заменой чего-либо.

То, что он делает, это передает ваш запрос с параметрами @param1 ... @paramN прямо в SQL Server вместе с набором пар имя / значение параметра.Затем SQL Server выполняет те, которые используют sp_executesql хранимый процесс.

Никаких замен не производится, на клиентской стороне нет «связывания вместе полного оператора SQL» - ничего подобного.Если это то, чем занималась среда выполнения ADO.NET, то она также будет очень восприимчива к атакам с использованием SQL-инъекций.

0 голосов
/ 14 июля 2010

Краткий ответ: при его использовании добавляется значение в конец SqlParameterCollection, в то же время обеспечивается безопасность значения параметра от SQL-инъекции.

Документация MSDN не документирует точное внутреннее поведение метода, и я сомневаюсь, что он делает то, что вы описываете. Однако, если вы хотите, вы можете просмотреть исходный код метода, используя Reflector и посмотреть, что именно он делает.

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