Eu trabalhei em um aplicativo asp.net que passou por uma auditoria de segurança por uma empresa líder em segurança e aprendi esse truque fácil para evitar uma vulnerabilidade de segurança menos conhecida, mas importante.
A explicação abaixo é de:
http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks
Considere usar o Page.ViewStateUserKey para combater ataques de um clique. Se você autenticar seus chamadores e usar o ViewState, defina a propriedade Page.ViewStateUserKey no manipulador de eventos Page_Init para impedir ataques com um clique.
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}
Defina a propriedade com um valor que você sabe que é exclusivo para cada usuário, como um ID de sessão, nome de usuário ou identificador de usuário.
Um ataque com um clique ocorre quando um invasor cria uma página da Web (.htm ou .aspx) que contém um campo de formulário oculto chamado __VIEWSTATE que já está preenchido com os dados do ViewState. O ViewState pode ser gerado a partir de uma página criada anteriormente pelo invasor, como uma página de carrinho de compras com 100 itens. O invasor atrai um usuário desavisado para navegar até a página e, em seguida, o invasor faz com que a página seja enviada ao servidor em que o ViewState é válido. O servidor não tem como saber que o ViewState se originou do invasor. A validação do ViewState e os HMACs não contrariam esse ataque porque o ViewState é válido e a página é executada no contexto de segurança do usuário.
Ao definir a propriedade ViewStateUserKey, quando o invasor navega para uma página para criar o ViewState, a propriedade é inicializada com seu nome. Quando o usuário legítimo envia a página ao servidor, ela é inicializada com o nome do invasor. Como resultado, a verificação do ViewState HMAC falha e uma exceção é gerada.