Por un Viewstate mas seguro..

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJOTU4MjMyMzI1DxYCHgRob2xhBQVtdW5kb2Rk0TeQYE/t2A4VPFBDnmXKxAU3Ndo=" />

A primera vista, el valor del Viewstate parece encriptado. Sin embargo está muy lejos de estarlo, sólo está codificado en Base64.
Con el siguiente código:

byte[] bytes = Convert.FromBase64String("/wEPDwUJOTU4MjMyMzI1DxYCHgRob2xhBQVtdW5kb2Rk0TeQYE/t2A4VPFBDnmXKxAU3Ndo=");
string decoded = System.Text.Encoding.ASCII.GetString(bytes);
Response.Write(decoded);

Se obtiene el siguiente resultado:

?xxxx 958232325xxxxxholaxxxmundodd?7?`O??xxx

No todo es totalmente entendible, pero si en vez de "hola" o "mundo" teníamos el número de tarjeta de un cliente.. se leería fácilmente.
Para securizar el Viewstate podemos utilizar un hash code y asegurarnos que nadie nos descifre (con el ejemplo de arriba) nuestro viewstate y nos lo modifique en nuestra página (utilizando tantas herramientas existentes como add-ins de IE (ej: iedevtoolbar), FF, etc). Para esto tenemos que habilitar el atributo EnableViewStateMAC en @Page o en <pages> dentro del Web.Config

Ej: <%@ Page EnableViewStateMac="true" %>

No voy a entrar en detalles de cómo ASP.NET se encarga de asegurarse que el Viewstate no fue modificado por nadie, simplemente decir que así sucede. Y si alguien lo hubiera modificado, ASP.NET no continúa con el Postback de la página sino que devuelve un error como:

The state information is invalid for this page and might be corrupted

Bien. Ahora estamos totalmente seguros? No todavía. Nuestro Viewstate esta hasheado, pero aún podría ser leído. Lo siguiente es habilitar la Encripción (de nuevo, a nivel de página o de sitio web)

<%@ Page ViewStateEncryptionMode="Always|Never|Auto" %>

Tres valores posibles para la propiedad, los cuales son:
Always: siempre encripta
Never: nunca encripta
Auto: es algo así como un "on demand" ya que si una página requiere que el Viewstate se encripte deberemos llamar a Page.RegisterRequiresViewStateEncryption(). Si nadie lo llama, la encriptación no procede ya que significa que no fue necesaria.

Cuando se produce el hashing o el encriptado, ASP.NET utiliza la información de clave y algoritmo de encriptación especificado en <machineKey> del Web.Config al que tendremos que agregarlo nosotros o del Machine.Config donde ya viene configurado por defecto. Para más información del <machineKey> y su configuración entrar aquí.

A tener en cuenta, la encripción tiene un pequeño impacto en la performance ya que ASP.NET se encarga de encriptar y desencriptar el Viewstate.

Espero que haya quedado claro y sepamos que a veces agregarle seguridad a nuestras aplicaciones web es cosa de segundos.

Cross-posted desde http://www.carloszanini.com.ar

Un comentario en “Por un Viewstate mas seguro..”

Deja un comentario

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