[Além do blog, eu também estou agora utilizando o
Twitter para atualizações rápidas e para compartilhar links. Siga-me
em: twitter.com/scottgu]
Este é o
décimo nono de uma série de posts que estou escrevendo sobre o próximo
lançamento do VS 2010 e .NET 4.
O post de hoje cobre um pequeno, mas muito útil,
novo recurso de sintaxe que está sendo introduzido com a ASP.NET 4 - que
é a capacidade de automaticamente criptografar a saída HTML dentro de
blocos de código. Isso ajuda a
proteger as suas aplicações e sites contra a injeção de script
cross-site (cross-site script injection) (XSS) e ataques de injeção de
HTML, permitindo que você faça isso usando uma sintaxe agradável e
concisa.
Encriptação do HTML
A injeção
de script cross-site (XSS) e ataques de injeção de HTML são dois dos
problemas de segurança mais comuns que atormentam web-sites e
aplicações. Eles ocorrem quando
hackers encontram uma maneira de injetar scripts no lado do cliente ou
tags HTML dentro de páginas web que são então visualizadas por outros
visitantes de um site. Isso pode ser
usado tanto para vandalizar um site, bem como para permitir que hackers
executem código de scripts no lado do cliente, o qual rouba dados de cookies e/ou
explora a identidade de um usuário em um site tendo em vista a realização de atos fraudulentos.
Uma forma
de ajudar a mitigar ataques de cross-site scripting é certificar-se que o HTML de saída renderizado seja encriptado dentro de uma página. Isso ajuda a garantir que todo o conteúdo que
possa ter sido entrado/modificado por um usuário final não possa ser
adicionado dentro de uma página que contenha tags iguais a
<script> ou <img>.
Como Encriptar Conteúdo HTML Hoje
Aplicações
ASP.NET (especialmente aquelas que usam ASP.NET MVC) baseiam-se
frequentemente no uso de expressões de código <%= %> para
renderizar o código HTML de saída. Os
desenvolvedores de hoje costumam usar os métodos de ajuda Server.HtmlEncode() ou HttpUtility.Encode() dentro destas expressões para encriptar o
HTML de saída antes que este seja renderizado. Isso pode ser feito usando código igual ao
mostrado a seguir:
Isso funciona
bem, porém há duas desvantagens ao usar este código:
- É um pouco verboso
- Os desenvolvedores
geralmente se esquecem de chamar o método Server.HtmlEncode() - e não há uma maneira fácil de
verificar seu uso em uma aplicação
Nova Sintaxe <%: %> para Blocos de
Código
Com a ASP.NET 4 nós estamos introduzindo uma nova
sintaxe de expressão de código (<%: %>) que renderiza a saída da
mesma maneira que <%= %> renderiza - mas que também
automaticamente encripta o HTML antes da renderização. Isso elimina a necessidade de encriptar o conteúdo HTML explicitamente, como fizemos no exemplo acima. Em vez disso, você pode simplesmente escrever o
código mais conciso mostrado a seguir para obter o mesmo resultado:
Nós escolhemos a sintaxe
<%: %> de modo que fosse fácil substituir rapidamente as
instâncias existentes de blocos de código <%= %>. Esta sintaxe também permite que você facilmente
procure na sua base de código por elementos <%= %> para localizar e
verificar qualquer caso onde você não está usando a encriptação do
código HTML dentro de sua aplicação. Isso garante que você tenha o
comportamento correto.
Evitando Encriptação Duplicada
Enquanto a
encriptação de conteúdo HTML é muitas vezes uma boa prática, há
momentos em que o conteúdo de saída que você está gerando é para ser
HTML ou o mesmo já se encontra encriptado - neste caso você não quer encriptar
o código HTML novamente.
A ASP.NET 4 introduz uma nova interface IHtmlString
(juntamente com uma implementação concreta: HtmlString) que
você pode usar em tipos, para indicar que o seu valor já está
devidamente encriptado (ou de outro modo examinado) para mostrá-lo como
HTML, e que, portanto, o valor não deve ser codificado em HTML
novamente. A sintaxe de bloco de
código <%: %> verifica a presença da interface IHtmlString
e não irá encriptar em HTML a saída da expressão de código se o seu
valor implementar essa interface. Isso
permite que os desenvolvedores evitem ter que decidir com base em cada
caso se devem usar blocos de código <%= %> ou <%: %>. Ao invés disso você pode sempre usar blocos de
código <%: %> e, então, fazer com que todas as propriedades ou
tipos de dados que já estão codificados em HTML implementem a interface IHtmlString.
Usando os Métodos de Ajuda HTML da ASP.NET MVC com <%:
%>
Para um exemplo prático de onde este mecanismo de encriptação de escape de HTML é útil, considere cenários onde você usa métodos
de ajuda HTML com a ASP.NET MVC. Estes métodos de ajuda tipicamente retornam HTML. Por exemplo: o método de ajuda HTML.TextBox() retorna marcação HTML igual a <input
type="text"/>. Com a ASP.NET MVC 2
estes métodos de ajuda agora por padrão retornam tipos HtmlString
- o que indica que o conteúdo da string retornada é seguro para a
renderização e não deve ser encriptado novamente em blocos de código <%:
%>.
Isso permite que você use estes métodos dentro de
blocos de código <%= %>:
Bem como dentro de
blocos de código: <%: %>:
Em ambos os casos mostrados acima,
o conteúdo HTML retornado do método de ajuda será renderizado para o
cliente como sendo HTML - e o bloco de código <%: %> irá evitar a codificação HTML duplicada.
Isto permite a você utilizar sempre por padrão o
bloco de código <%: %>, ao invés de blocos de código <%= %>
dentro de suas aplicações. Se você
quiser ser realmente explícito, você pode até criar uma regra que busca
por construções <%= %> e que sinalize qualquer caso encontrado
como um erro para enfatizar que a encriptação HTML sempre seja
realizada.
Gerando Visões Automaticamente com a ASP.NET
MVC 2
Quando você usa o VS 2010 (ou o Visual Web
Developer 2010 Express que é gratuito) para criar aplicações ASP.NET MVC
2, você verá que as visões que são criadas automaticamente usando a
janela de diálogo "Add View" (Adicionar Visão) agora por padrão sempre
usam os blocos <%: %> para gerar a saída HTML para qualquer conteúdo. Por exemplo, a seguir eu gerei automaticamente
uma Visão simples chamada "Edit" para um objeto Article. Note os três usos do bloco de código <%: %>
para o label, textbox e mensagem de validação (todos gerados com métodos
de ajuda HTML):
Resumo
A nova
sintaxe <%: %> fornece uma maneira concisa para
codificar/encriptar automaticamente o conteúdo HTML para renderizá-lo
como saída. Ela permite que você
torne o seu código um pouco menos verboso, verificando que você tenha
sempre conteúdo HTML codificado de maneira correta em todo o seu site. Isso pode ajudar a proteger suas aplicações
contra a injeção de script cross-site (XSS) e ataques de injeção de
HTML.
Espero que ajude,
Scott
Texto traduzido do post original por Leniel Macaferi.