Защита от SQL (injection), sql иньекции
Что же такое sql injection (иньекции).
Иньекция на самом деле это лишь добавок к Вашим параметр для формирования данных.
Что бы обратиться к БД с формы (code behinde) и передать значения с контрола, если использовать самый просто PostBack, можно обратиться напрямую к контролу и отправить значение сразу в БД.
Т.е. что то похожее на:
SQL:
string ValueForSelect = WebControlID.Value;
sql.SelectCommand="select top(10) * from Table1 where (CellName='"+ValueForSelect+"')";
Именно в этом случае мы имеем потенциально опасную выборку для иньекции.
Смысл ее работы что бы в значения селекта, в нашем случае не проверенной строковой переменной "ValueForSelect", скажем наш котрол обычный TexBox, тогда в него добавляется например ");UPDATE [dbo].[BigTable] SET [Name] = '77777777777' WHERE (id='1') " и тем самым, при работе функции будет не только выбрано 10 строк согласно условию, но и обновлена таблица "BigTable" с новым значение для нужного ID.
Вариации может быть сколько угодно много, в любом случае резервные копии спасут всех))
Этот же метод может быть использован, в Get, Post запросах.
Бороться с этим счастьем оказалось довольно просто.
Для например Select необходимо указать каждый параметр.
Т.е. например нам необходимо выбрать из той же таблице, те же данные но уже, параметрезированно:
Code behinde:
string ValueForSelect = WebControlID.Value;
SqlDataSource1.SelectParameters.Clear();
SqlDataSource1.SelectParameters.Add("ID", System.TypeCode.Int32, ValueForSelect);
SqlDataSource1.SelectCommand = "select top(10) * from Table1 where (id=@ID)";
Тогда если тот же запрос- иньекция ");UPDATE [dbo].[BigTable] SET [Name] = '77777777777' WHERE (id='1') " будет направлена в наш селект, ничего не произоидет.
В таком случае можно быть уверенным что такая "дырка" будет закрыта.
З.ы. Описал как мог:)