RSS feed
Consultoria em Software
Nova Sintaxe <%: %> para Encriptar código HTML com a ASP.NET 4 (e ASP.NET MVC 2) - ScottGu's Blog em Português

Nova Sintaxe <%: %> para Encriptar código HTML com a ASP.NET 4 (e ASP.NET MVC 2)


[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:

imagem

Isso funciona bem, porém há duas desvantagens ao usar este código:

  1. É um pouco verboso
  2. 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:

imagem

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 <%= %>:

imagem

Bem como dentro de blocos de código: <%: %>:

imagem

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):

imagem

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.

Published Wednesday, April 07, 2010 1:57 AM by Leniel Macaferi

Comments

# S&#233;rie de posts sobre Visual Studio 2010 e .NET 4 - ScottGu's Blog em Portugu??s

Pingback from  S&#233;rie de posts sobre Visual Studio 2010 e .NET 4 - ScottGu's Blog em Portugu??s

# Adicionando sites ?? sua conta

Friday, June 11, 2010 11:12 AM by Adicionando sites ?? sua conta

Pingback from  Adicionando sites ?? sua conta

# Twitter Trackbacks for Nova Sintaxe &lt;%: %&gt; para Encriptar c??digo HTML com a ASP.NET 4 (e ASP.NET MVC 2) - ScottGu's Blog em Portugu??s [asp.net] on Topsy.com

Pingback from  Twitter Trackbacks for                 Nova Sintaxe &lt;%: %&gt; para Encriptar c??digo HTML com a ASP.NET 4 (e ASP.NET MVC 2) - ScottGu's Blog em Portugu??s         [asp.net]        on Topsy.com

Leave a Comment

(required) 
(required) 
(optional)
(required)