Cuidados com o EventValidation


EventValidation é uma técnica que foi adicionada na versão 2.0 do ASP.NET e que permite validar o evento que se originou no cliente e que foi renderizado por alguma controle ASP.NET.

É muito comum em aplicações Web habilitar ou desabilitar um determinado controle do formulário. Isso pode as vezes acontecer por causa de uma condicional que, na maioria das vezes, é por causa das permissões do usuário corrente, pois ele não tem acesso aquela determinada funcionalidade. Com isso, imagine que tenhamos um botão no formulário e que as vezes estará habilitado, as vezes não. Como a página é renderizada no cliente, ele tem total acesso ao código fonte gerado; isso quer dizer que ele pode facilmente manipular as informações de postback para o servidor/página de onde originou a resposta e, conseqüentemente, ter acesso ao botão que, no momento, está desabilitado.

Para exemplo, imagine que o botão tenha sido ocultado (Visible = False). Agora, voce pode manipular a página (HTML), adicionar o botão, salvar e página e, finalmente, clicar no botão que foi adicionado. Se a propriedade EnableEventValidation da diretiva da página estiver definda como True (o padrão), uma exceção do tipo ArgumentException será disparada:

Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation=”true”/> in configuration or <%@ Page EnableEventValidation=”true” %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Agora, se por algum descuido voce desabilitou o EventValidation, o evento Click (server-side) deste botão será disparado, mesmo que voce o ocultou quando a página foi processada e enviada para o cliente. Mesmo que voce não adicione o HTML responsável pelo botão na página, voce poderia facilmente montar uma requisição via objetos HttpWebRequest/HttpWebResponse e no body da requisição, definir os campos, inclusive o campo que foi ocultado e, para isso, podemos utilizar o Fiddler para interceptar a requisição/resposta e entender como montá-la.

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s