Compartilhar via


Solicitação de validação – Impedir ataques de Script

Este artigo descreve o recurso de validação de solicitação de ASP.NET em que, por padrão, o aplicativo é impedido de processar conteúdo HTML não codificado enviado ao servidor. Esse recurso de validação de solicitação pode ser desabilitado quando o aplicativo foi projetado para processar dados HTML com segurança.

Aplica-se a ASP.NET 1.1 e ASP.NET 2.0.

A validação de solicitação, um recurso do ASP.NET oferecido desde a versão 1.1, impede que o servidor aceite conteúdo sem HTML codificado. Esse recurso foi criado para evitar alguns ataques de injeção de script, em que o código de script ou HTML do cliente pode ser enviado inadvertidamente para um servidor, armazenado e, em seguida, apresentado a outros usuários. Ainda recomendamos que você valide todos os dados de entrada e os codifique com HTML quando for apropriado.

Por exemplo, você cria uma página da Web que solicita o endereço de email de um usuário e armazena esse endereço de email em um banco de dados. Se o usuário inserir <o alerta SCRIPT>("olá do script")</SCRIPT> em vez de um endereço de email válido, quando esses dados forem apresentados, esse script poderá ser executado se o conteúdo não tiver sido codificado corretamente. O recurso de validação de solicitação de ASP.NET impede que isso aconteça.

Por que esse recurso é útil

Muitos sites não estão cientes de que estão abertos a ataques simples de injeção de script. Se a finalidade desses ataques é desfigurar o site exibindo HTML ou potencialmente executar o script do cliente para redirecionar o usuário para o site de um hacker, os ataques de injeção de script são um problema com o qual os desenvolvedores da Web devem enfrentar.

Os ataques de injeção de script são uma preocupação de todos os desenvolvedores Web, sejam eles usando ASP.NET, ASP ou outras tecnologias de desenvolvimento na Web.

O recurso de validação de solicitação ASP.NET impede proativamente esses ataques, não permitindo que o conteúdo HTML não codificado seja processado pelo servidor, a menos que o desenvolvedor decida permitir esse conteúdo.

O que esperar: Página de Erro

A captura de tela abaixo mostra alguns exemplos ASP.NET código:

Captura de tela que mostra um exemplo de código ASP.NET.

A execução desse código resulta em uma página simples que permite inserir algum texto na caixa de texto, clicar no botão e exibir o texto no controle de rótulo:

Captura de tela que mostra a execução desse código resulta em uma página simples que permite inserir algum texto na caixa de texto, clicar no botão e exibir o texto no controle de rótulo.

No entanto, se o JavaScript fosse inserido <script>alert("hello!")</script> e enviado, obteríamos uma exceção:

Se o JavaScript for inserido e enviado, será possível obter uma exceção.

A mensagem de erro afirma que um "valor Request.Form potencialmente perigoso foi detectado" e fornece mais detalhes na descrição sobre exatamente o que ocorreu e como alterar o comportamento. Por exemplo:

A validação da solicitação detectou um valor de entrada do cliente potencialmente perigoso e o processamento da solicitação foi anulado. Esse valor pode indicar uma tentativa de comprometer a segurança do aplicativo, como um ataque de script entre sites. Você pode desabilitar a validação de solicitação definindo validateRequest=false na diretiva Page ou na seção de configuração. No entanto, é altamente recomendável que seu aplicativo marcar explicitamente todas as entradas nesse caso.

Desabilitando a validação de solicitação em uma página

Para desabilitar a validação de solicitação em uma página, você deve definir o validateRequest atributo da diretiva Page como false:

<%@ Page validateRequest="false" %>

Cuidado

Quando a validação da solicitação é desabilitada, o conteúdo pode ser enviado para uma página; é responsabilidade do desenvolvedor de página garantir que o conteúdo seja codificado ou processado corretamente.

Desabilitando a validação de solicitação para seu aplicativo

Para desabilitar a validação de solicitação para seu aplicativo, você deve modificar ou criar um arquivo Web.config para seu aplicativo e definir o atributo validateRequest da <pages /> seção como false:

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

Se você quiser desabilitar a validação de solicitação para todos os aplicativos no servidor, poderá fazer essa modificação no arquivo Machine.config.

Cuidado

Quando a validação da solicitação é desabilitada, o conteúdo pode ser enviado ao seu aplicativo; é responsabilidade do desenvolvedor de aplicativos garantir que o conteúdo seja codificado ou processado corretamente.

O código abaixo é modificado para desativar a validação da solicitação:

Captura de tela que mostra que o código abaixo é modificado para desativar a validação da solicitação.

Agora, se o JavaScript a seguir foi inserido na caixa <script>alert("hello!")</script> de texto, o resultado seria:

Captura de tela que mostra se o JavaScript foi inserido na caixa de texto: o resultado seria um botão

Para evitar que isso aconteça, com a validação da solicitação desativada, precisamos codificar o conteúdo em HTML.

Como codificar conteúdo HTML

Se você desabilitou a validação de solicitação, é uma boa prática codificar conteúdo em HTML que será armazenado para uso futuro. A codificação HTML substituirá automaticamente qualquer '<' ou '>' (juntamente com vários outros símbolos) por sua representação codificada em HTML correspondente. Por exemplo, '<' é substituído por '<' e '>' é substituído por '>'. Os navegadores usam esses códigos especiais para exibir '<' ou '>' no navegador.

O conteúdo pode ser facilmente codificado em HTML no servidor usando a Server.HtmlEncode(string) API. O conteúdo também pode ser facilmente decodificado em HTML, ou seja, revertido para HTML padrão usando o Server.HtmlDecode(string) método .

Captura de tela que mostra que o conteúdo pode ser facilmente codificado em HTML no servidor usando a API Server.HtmlEncode(string). O conteúdo também pode ser facilmente decodificado em HTML, ou seja, revertido para HTML padrão usando o método Server.HtmlDecode(string).

Resultando em:

Captura de tela que mostra um botão