Compartir a través de


Validación de solicitudes: prevención de ataques de script

En este documento se describe la característica de validación de solicitudes de ASP.NET donde, de forma predeterminada, se impide que la aplicación procese contenido HTML sin codificar enviado al servidor. Esta característica de validación de solicitudes se puede deshabilitar cuando la aplicación se ha diseñado para procesar datos HTML de forma segura.

Se aplica a ASP.NET 1.1 y ASP.NET 2.0.

La validación de solicitudes, una característica de ASP.NET desde la versión 1.1, impide que el servidor acepte contenido que contenga HTML sin codificar. Esta característica está diseñada para ayudar a evitar algunos ataques por inyección de script por los que el código de script de cliente o HTML se puede enviar sin saberlo a un servidor, almacenarlo y, a continuación, presentarlo a otros usuarios. Se recomienda encarecidamente validar todos los datos de entrada y codificarlos HTML cuando corresponda.

Por ejemplo, cree una página web que solicite la dirección de correo electrónico de un usuario y, a continuación, almacene esa dirección de correo electrónico en una base de datos. Si el usuario escribe <SCRIPT>alert("hello from script")</SCRIPT> en lugar de una dirección de correo electrónico válida, cuando se presenten esos datos, este script se puede ejecutar si el contenido no se ha codificado correctamente. La característica de validación de solicitudes de ASP.NET impide que esto suceda.

Por qué esta característica es útil

Muchos sitios no son conscientes de que están abiertos a ataques simples de inyección de scripts. Tanto si el propósito de estos ataques es desfigurar el sitio mostrando al HTML o ejecutar potencialmente el script del lado del cliente para redirigir al usuario al sitio de un hacker, los ataques por inyección de scripts son un problema con el que los desarrolladores web deben enfrentarse.

Los ataques por inyección de scripts son una preocupación de todos los desarrolladores web, ya sea que usen ASP.NET, ASP u otras tecnologías de desarrollo web.

La característica de validación de solicitudes de ASP.NET impide estos ataques de forma proactiva no permitir que el servidor procese contenido HTML sin codificar, a menos que el desarrollador decida permitir ese contenido.

Qué esperar: Página de error

A continuación, en la captura de pantalla se muestra un código de ejemplo de ASP.NET:

Captura de pantalla que muestra un ejemplo de código de ASP.NET.

La ejecución de este código da como resultado una página sencilla que permite escribir texto en el cuadro de texto, hacer clic en el botón y mostrar el texto en el control de etiqueta:

Captura de pantalla que muestra la ejecución de este código da como resultado una página sencilla que permite escribir texto en el cuadro de texto, hacer clic en el botón y mostrar el texto en el control de etiqueta.

Sin embargo, si se introdujera y enviara JavaScript, como <script>alert("hello!")</script>, obtendríamos una excepción:

Si se escribe y envía JavaScript, se obtendrá una excepción.

El mensaje de error indica que se detectó un "valor de Request.Form potencialmente peligroso" y proporciona más detalles en la descripción sobre exactamente lo que ocurrió y cómo cambiar el comportamiento. Por ejemplo:

La validación de solicitudes ha detectado un valor de entrada de cliente potencialmente peligroso y se ha anulado el procesamiento de la solicitud. Este valor puede indicar un intento de poner en peligro la seguridad de la aplicación, como un ataque de scripting entre sitios. Puede deshabilitar la validación de solicitudes estableciendo validateRequest=false en la directiva Page o en la sección de configuración. Sin embargo, se recomienda encarecidamente que la aplicación compruebe explícitamente todas las entradas en este caso.

Deshabilitación de la validación de solicitudes en una página

Para deshabilitar la validación de solicitudes en una página, debe establecer el validateRequest atributo de la directiva Page en false:

<%@ Page validateRequest="false" %>

Precaución

Cuando la validación de solicitudes está deshabilitada, el contenido se puede enviar a una página; es responsabilidad del desarrollador de páginas asegurarse de que el contenido está codificado o procesado correctamente.

Deshabilitar la validación de solicitudes para su aplicación

Para deshabilitar la validación de solicitudes para la aplicación, debe modificar o crear un archivo Web.config para la aplicación y establecer el atributo validateRequest de la <pages /> sección falseen :

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

Si desea deshabilitar la validación de solicitudes para todas las aplicaciones del servidor, puede realizar esta modificación en el archivo Machine.config.

Precaución

Cuando la validación de solicitudes está deshabilitada, el contenido se puede enviar a la aplicación; es responsabilidad del desarrollador de aplicaciones asegurarse de que el contenido está codificado o procesado correctamente.

El código siguiente se modifica para desactivar la validación de solicitudes:

Captura de pantalla que muestra el código siguiente se modifica para desactivar la validación de solicitudes.

Ahora, si se escribió el siguiente Código JavaScript en el cuadro <script>alert("hello!")</script> de texto, el resultado sería:

Captura de pantalla que muestra si se ha escrito JavaScript en el cuadro de texto: el resultado sería un botón

Para evitar que esto suceda, con la validación de solicitudes desactivada, es necesario codificar el contenido en HTML.

Cómo codificar contenido html

Si ha deshabilitado la validación de solicitudes, se recomienda codificar en HTML el contenido que se almacenará para su uso futuro. La codificación HTML reemplazará automáticamente cualquier "<" o ">" (junto con otros símbolos) por su representación codificada en HTML correspondiente. Por ejemplo, '' se reemplaza por '<' y '' se reemplaza por '>'. Los exploradores usan estos códigos especiales para mostrar "<" o ">" en el explorador.

El contenido se puede codificar fácilmente en HTML en el servidor mediante la Server.HtmlEncode(string) API. El contenido también se puede descodificar fácilmente html, es decir, revertirse a HTML estándar mediante el Server.HtmlDecode(string) método .

Captura de pantalla que muestra el contenido se puede codificar fácilmente en HTML en el servidor mediante la API Server.HtmlEncode(string). El contenido también se puede descodificar fácilmente html, es decir, revertirse a HTML estándar mediante el método Server.HtmlDecode(string).

Como resultado:

Captura de pantalla que muestra un botón