Использование параметризованных запросов будет в значительной степени защищать вас от атак с использованием SQL-инъекций, поскольку большинство плохих вещей происходит в части значений ваших where
условий.
Например, если задано условие a=="hello" && b=="WORLD"
, выполнитеthis:
select a,b,c,d
from table
where a=@pa and b=@pb -- this is generated dynamically
Затем свяжите @pa="hello"
и @pb="WORLD"
и выполните свой запрос.
В C # вы начнете с представления в памяти вашей where
в памятив предложении, проходите его поэлементно и производите два выходных объекта:
- Строка с предложением
where
, где константы заменяются автоматически сгенерированными ссылками на параметры pa
,pb
и т. Д. (Используйте вашу любимую схему именования для этих скрытых параметров: фактические имена не имеют значения) - Словарь пар имя-значение, где имена соответствуют вставленным параметрамв вашем предложении
where
и значениях, соответствующих константам, которые вы извлекли из представления выражения.
Имея эти выходные данные в руках, выподготовьте свой динамический запрос, используя строку, добавьте значения параметров, используя словарь, а затем выполните запрос к источнику РСУБД.
НЕ ДЕЛАЙТЕ ЭТОГО
select a,b,c,d
from table
where a='hello' and b='WORLD' -- This dynamic query is ripe for an interjection attack