Esta documentación está archivada y no tiene mantenimiento.

Proteger el estado de vista

Visual Studio 2005

La propiedad ViewState proporciona un objeto de diccionario para conservar valores entre las distintas solicitudes de una misma página. Éste es el método predeterminado que utilizan las páginas Web para conservar los valores de las propiedades de página y control entre acciones de ida y vuelta.

Cuando se procesa la página, se codifica el estado actual de la página y de los controles, y la cadena que se obtiene se guarda en la página en forma de campo oculto. Si la cantidad de datos almacenados en la propiedad ViewState excede el valor especificado en la propiedad MaxPageStateFieldLength, la cadena se guarda en la página en varios campos ocultos. Cuando se vuelve a enviar la página al servidor, la página analiza la cadena de estado de vista durante su inicialización y restablece la información de propiedades.

La información en este tema describe los procedimientos recomendados para mejorar la seguridad de los datos de la aplicación almacenados en el estado de vista.

Aunque se puede mejorar la seguridad de la aplicación siguiendo las buenas prácticas en materia de codificación y configuración, también es importante mantener actualizado el servidor Web con las últimas actualizaciones de seguridad de Microsoft Windows y Servicios de Internet Information Server (IIS), así como las actualizaciones de seguridad de Microsoft SQL Server o cualquier otra base de datos que almacene información de usuarios.

Puede encontrar información más detallada sobre los procedimientos recomendados para escribir código seguro y garantizar la seguridad de las aplicaciones en el libro "Writing Secure Code", de Michael Howard y David LeBlanc, o a través de la especificación Microsoft Patterns and Practices.

Proteger los datos de estado de vista en la página

De forma predeterminada, los datos de estado de vista se almacenan en un campo oculto de la página y se codifican mediante base64. Además, se crea un valor hash a partir de los datos utilizando una clave de código (MAC) de autenticación de equipo. El valor hash se agrega a los datos de estado de vista codificados y la cadena resultante se almacena en la página. Cuando se devuelve la página al servidor, el marco de trabajo de las páginas ASP.NET vuelve a calcular el valor hash de los datos de estado de vista y compara el hash con el hash almacenado anteriormente en la página. Si el valor hash no coincide, se produce una excepción que indica que los datos de estado de vista no son válidos.

El marco de trabajo de la página ASP.NET puede usar la creación de un valor hash para probar si los datos se han alterado o modificado. No obstante, los datos de estado de vista aún se ven y cabe la posibilidad de que usuarios malintencionados los intercepten y los lean.

Codificación MAC

Cuando el marco de trabajo de la página de ASP.NET crea un valor hash para el estado de vista, utiliza una clave MAC que se genera automáticamente o se especifica en el archivo Machine.config. En el último caso, se crea basándose en la dirección MAC del equipo. Esta dirección es el valor GUID único del adaptador de red del equipo.

A los usuarios malintencionados puede resultarles difícil utilizar técnicas de ingeniería inversa en la clave MAC basándose en el valor de la página y el estado de vista. De esta forma, la codificación MAC suele ser un método confiable para determinar si se han alterado los datos de estado de vista.

En general, cuanto más larga sea la clave MAC que se utiliza para generar el valor hash, menos probable será que el valor hash sea el mismo para las diferentes cadenas. Cuando se genera automáticamente la clave, ASP.NET utiliza codificación SHA1 para crear una clave de gran tamaño. Sin embargo, en un entorno de un conjunto de servidores Web, la clave debe ser la misma en todos. Si la clave no es la misma y la página se devuelve a un servidor distinto del que creó la página, el marco de trabajo de la página ASP.NET provocará una excepción. Por consiguiente, en un entorno de conjunto de servidores Web, es necesario especificar una clave en el archivo Machine.config en lugar de permitir que ASP.NET genere una automáticamente. Cuanto más larga sea la clave, más segura será, pero también se tardará mas tiempo en crear el valor hash; por tanto, es importante sopesar las necesidades de seguridad frente a las de rendimiento.

Cifrado

Aunque la codificación MAC ayuda a evitar la manipulación de los datos de estado de vista, no impide que los usuarios los vean. Los datos de estado de vista se almacenan en campos ocultos de la página y se codifican en base64. Puede impedir que otras personas vean los datos de dos maneras: transmitiendo la página por SSL y cifrando los datos de estado de vista. Exigir el envío de la página por SSL puede ayudar a evitar que las personas no autorizadas examinen los paquetes de datos y obtengan acceso a ellos.

Sin embargo, el usuario que solicitó la página podrá seguir viendo los datos de estado de vista porque SSL descodifica la página para mostrarla en el explorador. Esto está bien si protege los datos principalmente de las personas que no deben ver la página y no le preocupa que los usuarios autorizados tengan acceso para ver los datos de estado de vista. Sin embargo, en algunos casos, los controles podrían utilizar el estado de vista para almacenar información a la que ningún usuario debería tener acceso. Por ejemplo, la página podría contener un control enlazado a datos que almacena los identificadores del elemento (claves de datos) en el estado de vista. Si esos identificadores contienen información confidencial, como los Id. de los clientes o sus números de seguridad social, debe cifrar los datos de estado de vista además o en lugar de enviarlos por SSL.

Para cifrar los datos, establezca la propiedad ViewStateEncryptionMode de la página en true. Si almacena información en el estado de vista, puede utilizar las técnicas normales de lectura y escritura, ya que la página se encarga de las operaciones de cifrado y descifrado. El cifrado de los datos de estado de vista puede afectar el rendimiento de la aplicación; por tanto, no lo utilice a menos que sea necesario.

Cifrado del estado de control

Los controles Web pueden mantener pequeñas cantidades de datos, denominados estados de control, que son necesarios para la operación correcta del control. Cuando un control utiliza un estado de control, se envía al cliente un campo de estado de vista que contiene el estado de control con cada solicitud incluso cuando el estado de vista está desactivado para la aplicación o la página.

Los controles que utilizan el estado de control pueden requerir que ese estado de vista se cifre llamando al método RegisterRequiresViewStateEncryption. Si cualquier control en la página requiere que ese estado de vista se cifre, entonces, se cifrarán todos los estados de vista de la página.

Codificación del estado de vista por usuario

Si su sitio Web autentica a los usuarios, puede establecer la propiedad ViewStateUserKey en el controlador de eventos Page_Init para asociar el estado de vista de la página con un usuario específico. Esto ayuda a evitar ataques con un solo clic, en los que un usuario malintencionado crea una página Web válida, que ya contenga el estado de vista de una página previamente creada. El atacante atrae a continuación a una víctima para que haga clic en un vínculo que envía la página al servidor utilizando la identidad de la víctima.

Cuando se establece la propiedad ViewStateUserKey, la identidad del atacante se utiliza para crear el hash del estado de vista de la página original. Cuando se consigue que la víctima reenvíe la página, los valores hash serán diferentes porque las claves de usuario son diferentes. Se emitirá un error de comprobación en la página y se producirá una excepción.

Debe asignar a la propiedad ViewStateUserKey un valor único para cada usuario, como el nombre o identificador de usuario.

Proteger la configuración en un entorno de hospedaje compartido

En un entorno de hospedaje compartido, los usuarios malintencionados podrían modificar las propiedades de administración de estado, lo que podría afectar a otras aplicaciones del equipo. Esta acción se puede llevar a cabo mediante la modificación directa del archivo Machine.config, la modificación mediante las API de configuración y utilizando otras herramientas de configuración y administración. Puede ayudar a impedir las modificaciones en la configuración de la aplicación cifrando las secciones de los archivos de configuración. Para obtener más información, vea Cifrar información de configuración mediante una configuración protegida

Vea también

Mostrar: