Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
862
Assunto : ASP.NET
Titulo: Tratando o erro de ValidateRequest

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



O ASP.NET adicionou um recurso de segurança maior em nossas aplicações, através do atributo ValidateRequest na tag @Page

Com este atributo o ASP.NET verifica se existem caracteres suspeitos nos dados digitados, evitando assim que possa ocorrer um script injection no site.

O problema é que quando o ASP.NET identifica a existência de tais caracteres inválidos, a mensagem de erro exibida não é nada agradável. Então a questão é : Como poderíamos fazer para exibir uma mensagem agradável, dentro do contexto de nossa aplicação, quando este erro ocorrer ?

Seria normal pensarmos em utilizar um RegularExpressionValidator para nossos campos, porém seria por demais trabalhoso fazer isso para cada campo de nossa aplicação.

A solução então é interceptar o erro gerado pelo ValidateRequest. Mas esta também não é uma solução simples de fazer. O evento Error da página ocorre tarde demais para fazer essa interceptação, exigindo um overrides no OnError.

Veja um exemplo :

Protected Overrides Sub OnError(ByVal e As System.EventArgs)
Dim ex As Exception
ex = Server.GetLastError

If TypeOf ex.GetBaseException Is System.Web.HttpRequestValidationException Then
Response.StatusCode = 200
Response.Write("Você tentou fazer um script injection")
Response.End
Else
MyBase.OnError(e)
End If
End Sub

Porém isso não resolve o problema. Não resolve porque quando o erro ocorrer será exibida apenas a mensagem de erro, toda a página e seu layout deixarão de ser exibidos, o que não é agradável. Realmente não tem como fazer com que o processamento da página seja reiniciado a partir deste ponto.

A solução para o problema é fazermos um overrides na função DeterminePostBackMode, que é a função que inicia o processo que irá fazer o validate request.

Além disso, nos aproveitamos dos recursos de validação do próprio ASP.NET, utilizando um customValidator e um validationSummary para exibir a mensagem de erro.

Veja como fica :

Public deuerro As Boolean

Protected Overrides Function DeterminePostBackMode() As System.Collections.Specialized.NameValueCollection

Try
Return MyBase.DeterminePostBackMode()
Catch ex As HttpRequestValidationException
Dim col As New NameValueCollection
col.Add(System.Web.HttpContext.Current.Request.Form)
col.Add(System.Web.HttpContext.Current.Request.QueryString)
deuerro = True
Return col
End Try
End Function

Realizamos a tarefa normal da função, porém no meio de um tratamento de erro. Se a função retornar um erro de validação de dados (HTTPRequestValidationException) então nós mesmos nos encarregamos de juntar o request.form e request.querystring em uma única namedvalueCollection e devolve-la, mas não sem antes marcarmos um flag indicando que o erro ocorreu.

Isso porque o customvalidator vai utilizar esse flag para saber que houve erro e exibir a mensagem de erro, da forma mais simples possível :

Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate

args.IsValid = Not deuerro
End Sub


Desta forma conseguimos facilmente exibir uma mensagem de erro agradável quando ocorrer o erro de validação da requisição. Poderíamos ainda criar uma classe PaginaBase, herdando da classe Page, e fazer todas as nossas páginas herdarem de PaginaBase, para herdarem essa funcionalidade.



Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 1/31/2017 12:00:00 PM
nome: DOhynPQFKOtvnsoU
email: derby451@hotmail.com
comentário:
SV0FwQ http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/29/2017 9:33:00 AM
nome: lcpTjwuESscoRE
email: derby451@hotmail.com
comentário:
Mls51E http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/29/2017 9:33:00 AM
nome: qVmWBioHwrxOFFIeu
email: jogcbfn@hotmail.com
comentário:
xKONBa http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/3/2017 5:15:00 AM
nome: kSiNKvVyHCv
email: jfvynms4281rt@hotmail.com
comentário:
6avzbY http://www.FyLitCl7Pf7ojQdDUOLQOuaxTXbj5iNG.com

data: 7/13/2007 4:22:00 PM
nome: Leonardo
email: lzacche@yahoo.com.br
comentário:
Dennes,

Muito útil sua dica, mas algo me escapa:
Eu valido os dados de cada controle (tem como criar um único validador, para este fim, para todos os controles, independente de quantos sejam?) e, se falhar essa validação (conteudo suspeito), mostro a mensagem e não processo o botão (no meu caso, "salvar"). Mas o que tá acontecendo é que, mesmo depois que o usuário corrigir os dados (retirar o código não permitido), ainda está lançando a mesma exceção. Pq? como corrigir?

Obrigado!
LZ


 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br