Динамическое предложение WHERE и SQL-инъекция - PullRequest
2 голосов
/ 03 января 2012

Мне нужно создать функциональность для пользователей, чтобы определять ГДЕ критерии выбора - критерии будут динамическими.

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

Я использую C # / .NET Windows Application.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Использование параметризованных запросов будет в значительной степени защищать вас от атак с использованием 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
1 голос
/ 03 января 2012

Ах, две фазы.Приведенные вами имена столбцов и операторы не являются прямым вводом пользователя.Например, из списка, группы радиосвязи и т. Д. Затем String WhereClause = String.Format ("Where {0} {1} @ {0}", "Customer", "=");

Так что теперь у вас есть«Где Customer = @Customer».

Затем вы можете добавить aparamer Customer и установить его из пользовательского ввода.

Существует несколько способов атаковать это, в зависимости от сложности ваших критериев.быть хоть.

...