O ASP.NET codifica num campo "hidden" chamado __VIEWSTATE determinada informação que necessita de ser preservada entre postbacks.
Esta informação é encriptada (HAS), a key usada na sua encriptação é guardada no servidor e o HAS encriptado é colocado no viewstate. Apesar da integridade da protecção do ViewState estar assegurada, e ninguém poder adulterar essa informação, ainda assim é possível para o atacante enviar ViewState válido. Se isso acontecer, estaremos perante uma falha de segurança.
A solução apresenta pelo Rui Quintino na sua sessão "DEV013 - 0wn3d: Hacking ainda mais fácil em AJAX Web Sites" do TechDays 2007 foi incluir no ViewStateUserKey algo que fosse único em cada request, a Session.SessionID.
Desta forma, para o atacante, seria impossível recriar um ViewState igual e/ou válido em virtude da SessionID ser sempre diferente.
1: protected override void OnInit(EventArgs e)
2: { 3: ViewStateUserKey = Session.SessionID;
4:
5: base.OnInit(e);
6: }
"The SessionID property is used to uniquely identify a browser with session data on the server. The SessionID value is randomly generated by ASP.NET and stored in a non-expiring session cookie in the browser. The SessionID value is then sent in a cookie with each request to the ASP.NET application."
Apesar da SessionID ser uma boa solução, não é a única, o importante é encontrar formas de individualizar as páginas.
1: public class ViewStateUserKeyBasePage : System.Web.UI.Page
2: { 3: protected override void OnInit(EventArgs e)
4: { 5: if (Request.IsAuthenticated)
6: { 7: ViewStateUserKey = Context.User.Identity.Name;
8: }
9:
10: base.OnInit(e);
11: }
12: }
Neste exemplo, criei uma classe "ViewStateUserKeyBasePage" que será utilizada (herdada) em todas as páginas aspx.
O Context.User.Identity.Name é uma solução possível e cada caso é um caso :o)
No próximo post apresentarei uma outra solução “Remover o ViewState da página”!