Buscar este blog

viernes, 28 de enero de 2011

Asp.net 4.0: Permitir captura de etiquetas html dentro de un textbox.


En escasas ocasiones dentro de nuestra aplicación web es necesario permitir que el usuario ingrese cierto contenido con un formato de html. En versiones anteriores esto era posible, y era responsabilidad del programador la validación de dichas etiquetas para evitar que un usuario introdujera código malicioso a nuestra aplicación.

Con ASP.net 4.0 ahora  la validación es de manera automática. Si un usuario intenta agregar etiquetas de html una aplicación web, el resultado es una excepción. Esta validación automática puede ser desactivada mediante una sencilla instrucción del archivo de web.config.

Lo primero que hay que hacer es dentro de Visual Studio 2010 vamos a crear una nueva aplicación web. Agregamos una forma web nueva y vamos a crear controles básicos que permitan capturar etiquetas de html y un botón que provoque un postback de nuestra página.


<asp:TextBoxID="txtComments"runat="server"Rows="4"TextMode="MultiLine"ClientIDMode="Static"Width="400px"></asp:TextBox>

      <asp:Button ID="btnInsertScript"runat="server"Text="Insert
Inline"
onclick="btnInsertScript_Click"/>


En el codeBehind de nuestra página podemos comprobar que el html en realidad se capture y se pinte de manera correcta


htmlCode = HttpUtility.HtmlEncode(txtComments.Text);

          
Response.Write(this.txtComments.Text);

Al correr la aplicación y capturar un html dentro de ese textbox, y debido a que aún cambiamos el modo de validación dentro del web config, obtenemos la siguiente excepción.



Es importante mencionar que esta excepción ocurre dentro del HttpRequest, es decir, aun cuando nuestro código esté preparado para el manejo de excepciones con un try catch, este error ocurre antes de ejecutar cualquier código de nuestra página, incluso el Load. Si se quiere manipular esta excepción de manera personalizada, debe hacerse dentro del Archivo Global.asax.cs en el método Application_Error

voidApplication_Error(object sender, EventArgs e)

      
{

          
// Code that runs when an unhandled error occurs

           Response.Redirect("ErrorPage.htm");


}



Este manejo de excepciones controlará cualquier excepción que no sea correctamente manipulada correctamente en la aplicación.

Si queremos que esta validación automática sea deshabilitada para permitir el ingreso de html dentro de nuestro textbox, es necesario agregar la siguiente etiqueta dentro del nodo<system.web> en el archivo Web.config:



<httpRuntime requestValidationMode="2.0" />


Esto deshabilitará la validación y permitirá la captura de html :


 Nota importante: Esta es una manera de permitir que el usuario ingrese etiquetas de html dentro de nuestra aplicación. Sin embargo, nunca debe confiarse en cualquier texto capturado por un usuario, pues puede contener código malicioso que pueda provocar fallas en nuestra aplicación. Lo más conveniente es que cuando se va a devolver  un texto capturado hacia la interfaz de usuario, siempre utilizar el método HtmlEncode:

HttpUtility.HtmlEncode(txtComments.Text);

De esta manera todos las etiquetas de html serán rendereados completamente en la pantalla y no interpretados por el navegador.
Si se desea desplegar el html que el usuario ingresa, es mejor utilizar controles de Edición específicos para ello, o bien controlar de manera adecuada el código en el cual se inyectara dicho HTML.