Параметризованные строки и оператор LIKE и подстановочный знак

В своих поисках я видел использование параметризованных строк в SQL-запросах, сформированных следующим образом:

SqlCommand comm = new SqlCommand();
comm.CommandText="SELECT * FROM table WHERE field LIKE '%'+@var+'%'";
comm.Parameters.AddWithValue("var","variabletext");
SqlDataReader reader = comm.ExecuteReader();

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


person steventnorris    schedule 30.10.2012    source источник


Ответы (2)


Это не уязвимо для внедрения SQL.

Кто бы ни сказал вам, что это неправильно. '%'+@var+'%' обрабатывается как данные, а не как исполняемый код. Он оценивается как строка, а затем используется как образец в правой части LIKE.

Проблема возникла бы только в том случае, если бы вы EXEC получили результат такой конкатенации. Простое объединение строк в самом запросе не является проблемой.

person Martin Smith    schedule 30.10.2012
comment
-1 Вы должны проверить все исключения о проблеме с sql-инъекцией. Взгляните здесь: stackoverflow.com/questions/1429866/ - person Rikki; 30.10.2012
comment
@MohammadGoudarzi - Вы ошибаетесь. Здесь нет проблемы с SQL-инъекцией. OP уже использует параметризованные запросы. Они просто что-то связывают с параметром. Они не создают исполняемую строку путем конкатенации. - person Martin Smith; 30.10.2012
comment
@MohammadGoudarzi Я считаю, что Мартин прав. Я добавляю правку, чтобы сделать мое использование более понятным. - person steventnorris; 30.10.2012
comment
Вы не знаете, как выполнить указанный в вопросе код, потому что он не указан. Это может быть что угодно, например sp_executesql или exec, или может быть SqlCommand. Поэтому я думаю, что лучшим предложением будет безопасный способ выполнения кода. Ваше здоровье - person Rikki; 30.10.2012
comment
@KenWhite - параметризуется либо переменной, либо параметром. Это не имеет значения. Ни с одним из них не будет проблем. Однако в исходном вопросе конкретно упоминается parameterized string.. - person Martin Smith; 30.10.2012
comment
@MohammadGoudarzi - Я специально упомянул EXEC в своем ответе. - person Martin Smith; 30.10.2012
comment
@MohammadGoudarzi Я также добавил метод выполнения. (Я прочитал в ссылке вашего ответа проблемы с sp_executesql, но я не буду использовать это). - person steventnorris; 30.10.2012
comment
Также проверьте ссылку, которую я только что упомянул в сообщении и комментарии. Есть разница. - person Rikki; 30.10.2012
comment
Итак, @steventnorris решил проблему из-за вопроса! : D Ура всех - person Rikki; 30.10.2012
comment
@steventnorris - Да. У вас может возникнуть проблема, только если вы выполняете эту конкатенацию для создания строки, которую затем выполняете. Выполнение LIKE '%'+@var+'%'" в самом запросе - это нормально. - person Martin Smith; 30.10.2012

Вы должны использовать "SqlParameter" для отправки значений хранимой процедуре, выполняющей поиск. Цель "SqlParameter" - отклонить все вставки в значениях. Также, если вам нужно выполнить текст, содержащий sql-код, или объединить параметры, вы снова должны установить для свойства "CommandType" команды значение "Text" и использовать "SqlParameter" для отправки вашего значения в этот текст.

Ознакомьтесь с документацией Microsoft по этому поводу здесь:

http://msdn.microsoft.com/en-us/library/ff648339.aspx

а также еще один вопрос о stackoverflow здесь:

Как SQLParameter предотвращает внедрение SQL-кода?

Также посмотрите здесь, чтобы увидеть некоторые конкретные примеры:

Примеры внедрения SQL даже при использовании SQLParameter в .NET?

Обновлять:

Поскольку вы обновили вопрос, и теперь способ выполнения точно указан, в упомянутом вами коде больше нет проблемы с sql-инъекцией.

Ваше здоровье

person Rikki    schedule 30.10.2012
comment
Пробовал уже человек, он заблокирован, пока не отредактируешь ответ. Я сделаю это! обещать. ;) Ваше здоровье - person Rikki; 30.10.2012
comment
Вы должны сначала отредактировать ответ! Я не могу его отменить, он заблокирован. - person Rikki; 30.10.2012
comment
Я это сделал. : D всегда C # ,,, Ура - person Rikki; 30.10.2012