Nueva sintaxis para la codificación HTML de salida en ASP.NET 4 (y ASP.NET MVC 2)

[Además del blog, podéis seguir a Scott en twitter: twitter.com/scottgu]

Éste es el décimo noveno post de una serie sobre VS 2010 y .NET 4.
En el post de hoy veremos una pequeña, pero muy util, nueva característica de sintaxis que hemos introducido en ASP.NET 4 – es la habilidad de codificar la salida HTML de los nuggets. Esto nos ayuda a proteger nuestras aplicaciones y sitios contra ataques de cross-site scripting y de inyección HTML, y nos permite hacerlo usando una sintaxis muy concisa.
Codificación HTML
Los ataques de cross-site scripting(XSS) y de HTML son dos de las incidencias de seguridad más comunes que plagan las web y las aplicaciones web. Occurren cuando los hackers encuentran una forma de injectar código cliente o HTML en páginas web que están siendo visitadas por otras personas. Esto puede usarse tanto para destrozar un sitio, como para ejecutar código en los clientes que roben datos de las cookies y/o suplantar la identidad de un usuario para hacer cosas malas.
Una forma de mitigar estos ataques es asegurarte de que la salida renderizada sea HTML de la página. Esto asegura que cualquier contenido que haya sido introducido o modificado por un usuario final no pueda ser devuelto en la página con tags como o.
Cómo codificar contenido HTML hoy
Las aplicaciones ASP.NET (especialmente aquellas realizadas con ASP.NET MVC) confían en el uso de las expresiones . Los desarrolladores de hoy suelen usar los métodos de ayuda Server.HtmlEncode() o HttpUtility.Encode()para codificar la salida HTMl ántes de que sea renderizada. Esto se puede hacer usando un código como el siguiente

Aunque este código funciona, tiene dos problemas:
1- Es muy detallado.
2- Los desarrolladores suelen olvidar la llamada al método Server.HtmlEncode – y no hay una forma sencilla de verificar su uso a lo largo de la aplicación.
Nueva Sintaxis
Con ASP.NET 4 hemos introducido la nueva expresión sintáctica ( que renderiza bloques como – pero que codifica automáticamente a HTML ántes de hacer la llamada. Esto elimina la necesidad de codificar explícitamente el contenido HTML comó hacíamos en el ejemplo anterior. Ahora podemos escribir un código mucho más conciso para obtener el mismo resultado:

Elegimos la sintaxis para que sea más sencillo reemplazar los bloques de código . También nos permite buscar en nuestro código por elementos para encontrar y verificar todos los casos en los que no estamos usando la codificación HTML en nuestra aplicación para asegurarnos que tenemos el comportamiento deseado.
Evitando la doble codificación
Mientras que el contenido HTML codificado es normalmente una de las mejores prácticas, hay veces que el contenido que estamos devolviendo como HTML ya está codificado – en ese caso no queremos volver a codificar el HTML.
ASP.NET 4 introduce la nueva interfaz IHtmlString (junto a una implementación conreta: HtmlString) que podéis implementar en tipos para indicar que su valor ya está codificado para mostrarlo como HTML, y que el contenido no debe ser codificado de nuevo. La sintaxis comprueba la presencia de ka interfaz IHtmlString y no codificará la salida de expresiones de código si el valor implementa esta interfaz. Esto permite a los desarrolladores evitar tener que decidir caso por caso cuándo usar ó . Podemos usar siempre la sintaxis y tener todas las propiedades o tipos que ya implementa la interfaz IHtmlString.
Uso de métodos de ayuda en ASP.NET MVC con
Para ver un ejemplo práctico de este mecanismo imaginemos los escenarios en los que usamos métodos de ayuda fuertemente tipados con ASP.NET MVC. Estos métodos devuelven normalmente HTML. Por ejemplo, el método Html.TextBox() devuelve un HTML como . Con ASP.NET MVC 2 estos métodos de ayuda ahora devuelven variables del tipo HtmlString – lo que indica que el contenido devuelvo es seguro para renderizarse y no debe ser codificado por el bloque .
Esto nos permite usar estos métodos también en bloques :

También podemos usar bloques :


En ambos casos el contenido HTML devuelto del método de ayuda será renderizado en cliente como HTML – y el bloque evitará la doble codificación.
Esto nos permite usar siempre los bloques en lugar de los bloques en nuestras aplicaciones. Si queremos asegurarnos al 100% debemos crear una regla de compilación que busque todos los usos de e indique que hay un error que va ha hacer que la codificación HTML siempre se haga.
Construyendo vistas ASP.NET MVC 2
Cuando usamos VS 2010 (o la gratuita Visual Web Developer 2010 Express) para crear aplicaciones ASP.NET MVC 2, veremos que las vistas que hemos creado usando el diálogo “Add View” usa por defecto los bloques cuando muestra cualquier contenido. Por ejemplo, aquí he creado una vista simple de edición para un objeto Article. Fijaos en los tres usos de los bloques para el label, el textbox y el mensaje de validación (todas las salidas con métodos de ayuda HTML):

Resúmen
Los nuevos bloques nos ofrecen una forma sencilla de codificar automáticamente el contenido HTML y renderizar la salida. Esto nos permite escribir un poco menos de código, y comprobar/verificar que siempre enviamos HTML codificado en nuestro sitio. Esto nos ayuda a proteger nuestras aplicaciones contra ataques de de cross-site scripting(XSS) e inyección de HTML.
Espero que sirva.
Scott.
Traducido por: Juan María Laó Ramos.
Artículo original

0 comentarios sobre “Nueva sintaxis para la codificación HTML de salida en ASP.NET 4 (y ASP.NET MVC 2)”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *