I думаю у вас все хорошо: согласно электронной документации по SQL Server , одиночная одиночная кавычка, похоже, является единственным способом выхода строки в кавычках это было начато с одной цитаты. Таким образом, замены '
на ''
должно быть достаточно, чтобы избежать внедрения SQL через string
переменных.
Я не могу придумать, как внедрить SQL через другие, нестроковые собственные типы данных C #, если они правильно (инвариантные по языку) преобразованы в строки.
Тем не менее, параметризованные запросы являются «рекомендуемым» решением. На данный момент ваше приложение выглядит так:
- Часть A создает инструкцию WHERE на основе пользовательского ввода.
- Строка, содержащая этот оператор WHERE, передается в часть B.
- Часть B добавляет SELECT и т. Д. И отправляет его на SQL Server.
Будет ли вариант переписать ваше приложение следующим образом?
- Часть A создает параметризованный оператор WHERE плюс набор параметров на основе пользовательского ввода.
- Строка, содержащая инструкцию WHERE плюс Hashtable (или что-то подобное), содержащее параметры, передается в часть B.
- Часть B создает команду, добавляет SELECT и т. Д., Добавляет параметры и отправляет ее на SQL Server.
Я был в подобной ситуации и решил ее, создав класс SubSQL
, который в основном содержит параметризованную строку с CommandText и хэш-таблицу с параметрами. Затем вы можете использовать это как mySubSQL.CommandText += ...
, mySubSQL.Parameters("@myfield") = myValue
и mySubSQL.MergeInto(myCommand)
(реализация должна быть очевидной и простой).