Реклама:

ÇJ ПРИМЕЧАНИЕ Некоторые элементы управления границами данных, например GndView или DetailsView, запрашивают шифрование ViewState сразу после указания ключей в свойстве DataKeyNames.

Поле ViewState позволяет защитить от модификации данных и атак. Более подробная информация об этом представлена в главе 3.

Удаление ViewState из выходных данных страницы

Вы можете удалить все данные ViewState из визуализированной страницы и сохранить их в состоянии сеанса или в файле. Это дает такие дополнительные преимущества, как возможность задания тайм-аута в поле ViewState для сдерживания повторной передачи пакетов или сообщении (при этом также уменьшается размер визуализированных страниц).

В ASP.NKT 2.0 введен класс PageStatePersister, предназначенный для сохранения ViewState. По умолчанию страницы применяют так называемый класс. HiddenField-PageStatePersister, который использует скрытое поле ViewState. Еще один класс Session-PageStat с Persister сохраняет ViewState ь сеансе. В этом случае ны можете указать странице на необходимость использовать этот persister путем переписывания свойства PageStatePersister класса page.

j)rotected override PagoSiatePersister PageStatePersister (

get

{

return new SessionPageStatePersister(this);

}

Данный код может быть частью страницы или базового класса page.

ПРИМЕЧАНИЕ По умолчанию сеансовый persister хранит стек последних девяти сохраненных данных ViewState (которые можно конфигурировать через элемент конфигурации <sessionPageState>). Каждый запрос создает в этом стеке новый элемент, а когда весь стек заполняется, элемент удаляется. Следует быть осторожнее, когда пользователи имеют возможность открывать множество окон в одном и том же приложении, поскольку может возникнуть ситуация, в которой вы потеряете сеансовые данные ViewState из-за этого ограничения.

Вы можете также написать собственный механизм персистентности путем выведения из класса PageStatePersister, замены методов Save и Load и возврата собственного persister из свойства Page.PageStatePersister.

Приведенная далее простая реализация является упрощенной версией SessionPage-StatePersister. Данные ViewState и ControlState хранятся во вспомогательном контейнере Pair и поддерживаются в состоянии сеанса. Идентификационный номер этого элемента в сеансе вкладывается в вило скрытого поля визуализированной страницы.

public class MyPageStatePersister : PageStatePersister {

public MyPageStatePersister(Page p) : base(p) { I

public override void Save() {

Pair state = new PairO;

state.First = base.ControlState;

state.Second = base.ViewState;

string id = Guid.NewGuid().ToString();

base.Page.RegisterHiddenField("ViewStateID", id);

base.Page.Session[id] = state;

)

public override void Load() {

string id = base.Page.Reauest.Form["ViewStateIu"]; Pair state = (Pair)base.Page.Session[id]; base.Page.Session.Remove!id); base.ControlState = state.First; base.ViewState = state.Second;

}

}

Резюме

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


⇐ Предыдущая страница| |Следующая страница ⇒