Introducción
Cuando tenemos páginas ASP.NET en las que el usuario puede introducir código, por ejemplo mediante una caja de textos, podemos hacer que el propio ASP.NET "valide" dicho código de forma automática. Esa es la forma predeterminada de las páginas (o formularios) ASP.NET.
¿Por qué validar el código?
Dependiendo de qué es lo que haga nuestra página ASPX, el código que introduce el usuario puede resultar "perjudicial", (o no deseado), por ejemplo si dicho código posteriormente se va a mostrar en otra página. En esos casos, es posible que el usuario escriba código HTML para realizar cualquier tipo de acción, desde mostrar una imagen que está alojada en otro servidor, hasta redirigirnos a otro sitio.
Eso se conseguiría simplemente introduciendo código HTML en la susodicha caja de textos, al mostrarse dicho código, el navegador haría lo que el código HTML le indica... por tanto podría indicarle algo que no es lo que el autor de la página realmente quería indicar.
Casos muy conocidos son las llamadas "inyecciones SQL", pero de ese tema, seguramente hablaremos en otra ocasión.
Todo el tema de validación no solo afecta a las páginas ASP.NET (ASPX) sino también a cualquier otro sistema que envíe código al servidor, ya sea ASP o cualquiera que muestre el código que alguien introdujo en algún sitio, pero lo que aquí interesa, ya que esta sección es sobre ASP.NET es saber cómo el propio ASP.NET soluciona (o nos ayuda a solucionar) este tipo de "intrusiones" al código...
La solución presentada por ASP.NEY para las páginas ASPX
Cuando creamos una página ASPX, de forma predeterminada se validará el código que se quiere enviar al servidor. Es decir no se admitirá código que contenga secuencias HTML o algo que se le pueda parecer, ya que realmente no se comprueba si el código HTML válido, sino que esté formado al estilo HTML, por ejemplo, secuencias que contengan <loquesea>, es decir que esté encerrado entre signos de apertura y cierre de "tags" HTML, el cual se indica mediante los signos de menor y mayor.
Como te comentaba, ASP.NET de forma predeterminada "impide" que se envíen esos "tags" al servidor, tanto es así que si en el código a enviar encuentra esa "posible secuencia" de comandos HTML, se producirá un error.
Pero en ciertas ocasiones, si queremos que lo que se vaya a mandar al servidor pueda contener el par < ... >, en esas ocasiones preferiríamos que no se produjese ningún error y que se aceptase el código a enviar. Para poder lograr este objetivo, tenemos que decirle a ASP.NET que sea benévolo y no nos restrinja dicho código, para ello debemos usar el atributo ValidateRequest de las páginas ASPX y asignarle un valor "false".
¿Dónde se utiliza el atributo ValidateRequest?
Si queremos que no se valide el código enviado al servidor por una página ASPX lo tendremos que poner en la directiva @ Page. Esta directiva es la que se usa para indicar que realmente se trata de una página ASPX y suele estar en la parte superior del fichero, por ejemplo:
<%@ Page Language="vb" ValidateRequest="true" AutoEventWireup="false" %>
Nota:
El valor predeterminado del atributo ValidateRequest es "true", por tanto, salvo que se indique lo contrario, siempre estará activo.
¿De que nos protege este atributo (si está activado)?
Como te he comentado, se comprueba el código que se envía al servidor y si dicho código contiene alguna secuencia que se pueda considerar "maliciosa", se producirá un error (o excepción) del tipo HttpRequestValidationException.
Según la documentación de Visual Studio .NET, el código introducido se compara con una lista de código "potencialmente" malicioso.
¿Cómo desactivar la validación automática?
Para desactivar la validación automática, (ahora veremos porqué y en qué condiciones se debería hacer esto), simplemente tenemos que añadir el atributo ValidateRequest = "false" a la directiva @ Page de nuestra página ASPX:
<%@ Page ValidateRequest="false" ...otros atributos... %>
De esta forma, todo lo que hagamos en esa página será por nuestra cuenta y riesgo.
¿Por qué desactivar la validación automática?
Una de las razones podría ser porque sabemos que el usuario va a escribir código que el "detector" de validación de ASP.NET puede considerar no aceptable, pero si sabemos que dicho código no se va a emplear para "mostrar" ninguna otra página, (que es cuando realmente puede ser maligno), sino que se va a usar internamente, podemos deshabilitar esa comprobación.
Por ejemplo, en la página que utilizo para el conversor de código de Visual Basic .NET a C# lo he tenido que deshabilitar para poder usar cualquier código de Visual Basic, ya que en algunos atributos me daba error de "validación".De todas formas, una vez que el atributo ValidateRequest tiene un valor false, podemos usar otros mecanismos de comprobación, por ejemplo el método HtmlEncode del objeto Server. De esa forma, podemos cambiar el código que "posiblemente" pueda causar problemas y así poder devolver una página HTML que muestre correctamente los tags.
Por ejemplo, si cambiamos todos los signos < por < y > por > el código HTML resultante será válido, pero internamente no contendrá "posibles" códigos maliciosos.
Nota:
Cuando se usa HtmlEncode, el código generado no contiene los signos de mayor y menor sino una "representación" de los mismos, por tanto dicho código no se interpreta sino simplemente se muestra.
También hay que tener en cuenta que si ValidateRequest está activado (que es el valor por defecto), HtmlEncode no tendrá ningún efecto... o al menos esa es la impresión que a mi me ha dado en las pruebas realizadas, ya que a pesar de "cambiar" el código me seguía mostrando error.
Resumiendo:
- De forma predeterminada, las páginas ASPX tienen activada la comprobación del código que se va a enviar al servidor.
- Dicha validación automática se puede ignorar asignando un valor false al atributo ValidateRequest, el cual se debe indicar en la directiva @ Page de la página ASPX.
- Independientemente de que esté desactivada, podemos usar HtmlEnconde para validar (o cambiar) manualmente el código a enviar o a mostrar.
Para más información:
En inglés, sobre el código malicioso en el código HTML:
http://www.cert.org/advisories/CA-2000-02.html
Documentación de Visual Studio:
ms-help://.../vbcon/html/vbtskProtectingAgainstScriptExploitsInWebApplication.htm
ms-help://.../cpref/html/frlrfSystemWebHttpServerUtilityClassHtmlEncodeTopic.htm
ms-help://.../vbcon/html/vbconscriptingexploits.htm
ms-help://.../vbcon/html/vbconoverviewofwebapplicationsecuritythreats.htm
En línea y en castellano: http://msdn.microsoft.com/library/spa/
Los links indicados con ms-help son de la documentación de VS y se pueden usar si tienes el Visual Studio instalado, pero también los puedes ver en línea si usas lo que hay después de los tres puntos suspensivos y cambias la extensión de .htm a .asp y todo eso lo pegas a continuación del link de la documentación en línea, por ejemplo:
http://msdn.microsoft.com/library/spa/vbcon/html/vbtskProtectingAgainstScriptExploitsInWebApplication.asp
Nos vemos.
Guillermo
Nerja, 15 de junio de 2004