Элементы управления ASP.Net предоставляют SQL-запросы через viewstate? - PullRequest
4 голосов
/ 22 февраля 2012

Есть ли элементы управления, которые являются частью набора элементов управления ASP.Net по умолчанию - ВСЕ используют постоянное состояние viewstate или controlstate?

т.е. Если я перенесу приведенный ниже код в совершенно новую веб-форму, моя строка SQL будет помещена в незашифрованное контрольное состояние?

<asp:SqlDataSource ID="mobileData" runat="server" 
        DataSourceMode="DataReader" 
        SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL" 
/>

Я знаю, как зашифровать viewstate и controlstate, но мне кажется безумным, что этот общий случай использования может быть настолько ужасно небезопасным. Конечно, можно выполнить атаку SQL-инъекцией, изменив контрольное состояние?

Я думаю, что большинство людей думают о шифровании контрольного состояния для чувствительных приложений, но на самом деле, если мое предположение верно, то это всегда должно быть сделано - и Visual Studio должна включить его по умолчанию?

Правильно ли я думаю об этом или у меня неправильный конец палки?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Чтобы ответить на ваш вопрос, нет .
От MSDN

В целях безопасности свойство SelectCommand не сохраняется в состоянии просмотра. Потому что можно расшифровать содержимое просмотра состояние на клиенте, хранение конфиденциальной информации о базе данных структура в состоянии просмотра может привести к раскрытию информации уязвимость.

1 голос
/ 22 февраля 2012

Эта информация никогда не сохраняется в ViewState.Не все свойства создаются так:

public string SomeProperty
        {
            get
            {
                object obj = ViewState["SomeProperty"];
                return (obj == null) ? 0 : (string)obj;
            }
            set
            {
                ViewState["SomeProperty"] = value;
            }
        }

SelectCommand здесь назначается в сгенерированном классе C # / Vb PageParser.Этот класс будет содержать строку типа

 mobileData.SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL"

, и это присваивание выполняется каждый раз, когда запрашивается страница.ASP .Net не нужно хранить это в ViewState.

Однако, если вы сделаете что-то вроде

  <asp:HiddenField runat="server" Value="SELECT * from ma.bob WHERE Vendor IS NOT NULL" />

Это пойдет в ViewState (то, что я сказал о парсере, верно и здесь, но сеттер реализует здесь этот механизм ViewState)

...