ASP .NET - Usando os métodos HtmlEncode e HtmlDecode


Você conhece os métodos HtmlEncode e HtmlDecode da ASP .NET ?

Geralmente poucos desenvolvedores conhecem e utilizam estes métodos.

O método HtmlEncode codifica uma seqüência específica a ser exibida em um navegador.

Ele é importante para codificar strings com caracteres especiais que não podem ser escritos diretamente na página HTML, antes de sua renderização na página, principalmente para evitar injeção de script cross-site(XSS) e ataques de injeção HTML.

O termo XSS, também conhecido como CSS (Cross Site Scripting, não confundir com Cascading Style Sheets), é uma vulnerabilidade muito comum encontrada em aplicativos web. O XSS permite ao atacante inserir códigos maliciosos nessas páginas para que sejam executados no momento em que tais páginas forem acessadas. 

O ataque permite que conteúdos (scripts) em uma zona sem privilégio seja executado com permissão de uma zona privilegiada, ou seja, escalação de privilégios no cliente (web browser) executando o script.

Caracteres como ponto de interrogação(?), comercial (&), barras (/). sinais de maior, menor <,>), espaços, etc. podem ser truncados ou corrompidos por alguns navegadores e dessa forma esses caracteres devem ser codificados em tags <a> ou sequência de consultas, onde as strings podem ser reenviadas por navegador em requisições.

O método HtmlEncode é uma maneira conveniente de acessar o método HttpUtility.HtmlEncode em tempo de execução a partir de um aplicativo ASP.NET. (Internamente, HtmlEncode usa HttpUtility.HtmlEncode para codificar seqüências de caracteres.)

Exemplo: O texto : "Macoratti.net < Visual Basic >." deve ser codificado para "Macoratti.net &lt; Visual Basic &gt;."

Para isso usamos o método HtmlEncode do Server:

Dim textoNormal As String = "Macoratti.net < Visual Basic >"
Dim textoCodificado As String = Server.HtmlEncode(textoNormal)

Em geral o método pode usar no máximo dois parâmetros, o primeiro parâmetro é a string que deve ser codificada e segundo parâmetro é um "TextWriter", um fluxo de saída, que contém a seqüência codificada.

Esta operação é geralmente necessária em cenários onde temos as seguintes situações:

· Passagem de valores de uma página para outra;
· Acesso a URL ou passar a URL;
· Busca ou inclusão de dados em um banco de dados;
· Leitura ou inclusão de dados XML;
· Mudança de caracteres especiais em uma string;
· Utilização de segurança;

O método HtmlDecode converte uma seqüência de caracteres que foi codificado em HTML para a transmissão HTTP em uma seqüência de caracteres decodificada. A decodificação HTML reverte a codificação feita anteriormente pelo método HtmlEncode.

Na plataforma .NET temos três maneiras de usar esses métodos :

· Server.HtmlEncode()
· Server.HtmlDecode()
· Server.HtmlUrlEncode()
· Server.HtmlUrlDecode ()
· HttpUtility.UrlEncode()
· HttpUtility.UrlDecode ()

Vamos abrir o Visual Web Developer 2010 Express Edition e criar um novo web site usando o template ASP .NET Empty Web Site com o nome HtmlEncode_Decode:

Vamos incluir um Web Form no projeto usando o menu WebSite -> Add New Item, template Web Form e aceite o nome Default.aspx;

A seguir vamos incluir no web form os controles TextBox e Button a partir da ToolBox conforme o leiaute abaixo:

A seguir vamos incluir no evento Click do botão de comando Encode, no arquivo code-behind Default.aspx.vb , o seguinte código:

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub cmdEncode_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdEncode.Click
    
   'Pega a String
        Dim convString As String = txtLeTexto.Text
     
  'Cria o objeto StringWriter para codificar e decodificar
        Dim tw As New System.IO.StringWriter
        Dim tw1 As New System.IO.StringWriter
     
  'Codifica o HTML usando Encode
        Server.HtmlEncode(convString, tw)
     
  'Decodifica o HTMLCode
        Server.HtmlDecode(convString, tw1)
      
 'Exibe o texto Codificado(Encoded)
        txtMsg.Text = tw.ToString
      
 'e decoficado(Decoded) no TextBox
        txtDecode.Text = tw1.ToString
    End Sub
End Class

Executando o WebSite e digitando uma string obtemos o seguinte resultado:

Vejamos a seguir uma outra maneira de fazer a mesma coisa. Vamos incluir um novo botão de comando com o texto Encode 2;

A seguir no evento Click do botão Encode 2 vamos incluir o seguinte código:

  Protected Sub btnEncode2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEncode2.Click
     
  ' texto HTML.
        Dim texto As String = txtLeTexto.Text
  
     ' efetua a codificação dos caracteres & , >
        Dim htmlEncoded As String = Server.HtmlEncode(texto)
    
   ' Decodifica o texto
        Dim original As String = Server.HtmlDecode(htmlEncoded)
    
   ' Acessado o método da classe Server
        Dim alsoEncoded As String = HttpContext.Current.Server.HtmlEncode(texto)
        Dim stringWriter As New System.IO.StringWriter()
     
  Using writer As New HtmlTextWriter(stringWriter)
         
  ' Escrevendo uma DIV com texto
            writer.RenderBeginTag(HtmlTextWriterTag.Div)
            writer.WriteEncodedText(texto)
            writer.RenderEndTag()
        End Using

        Dim html As String = stringWriter.ToString()
        txtMsg.Text = html
    End Sub

Executando o projeto teremos:

Vejamos agora o método HttpUtility.UrlEncode()

Vamos usar o método Load do formulário para gerar a URL usada e usando o método Encode vamos codificar a URL.

Inclua no evento Load do formulário o seguinte código:

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim strUrl As String = Request.Url.ToString()
     
  'Request.Url pega a url
        Response.Write("<font color='green'>A URL é:</font> "
& strUrl & "<br/>")
    
   'Aplica o Encode na URL
        Response.Write("<font color='green'>A URL Codificada é : </font>"
& HttpUtility.UrlEncode(strUrl))
    End Sub

Executando o projeto teremos:

A URL : http://localhost:50102/HtmlEncode_Decode/Default.aspx
foi codificada para :
http%3a%2f%2flocalhost%3a50102%2fHtmlEncode_Decode%2fDefault.aspx

Para decodificar a URL basta aplicar o método HttpUtility.UrlDecode().

Você pode verificar o processo on-line acessando o site: http://ostermiller.org/calc/encode.html

O resultado obtido pela codificação(Encode) para http://www.macoratti.net  é o seguinte:
  1. URL => http%3A//www.macoratti.net
  2. Base 64 => aHR0cCUzQS8vd3d3Lm1hY29yYXR0aS5uZXQ=
  3. Hex => 614852306343557a51533876643364334c6d31685932397959585230615335755a58513d

Pegue o projeto completo aqui: HtmlEncode_Decode.zip

Gál 3:13-14 "Cristo nos resgatou da maldição da lei, fazendo-se maldição por nós; porque está escrito: Maldito todo aquele que for pendurado no madeiro; para que aos gentios viesse a bênção de Abraão em Jesus Cristo, a fim de que nós recebêssemos pela fé a promessa do Espírito."

Referências:


José Carlos Macoratti