La mayoría de las veces tenemos que almacenar información entre peticiones de página. Como siempre, tenemos muchas maneras de hacer esto. La regla general es que si lo que precisamos es seguridad, administramos el estado del lado del servidor. Si lo que precisamos es rendimiento utilizamos administración de estado del lado del cliente.
Al utilizar administración de estado del lado del cliente es recomendable no almacenar información sensible. El método más común para almacenar información del lado del cliente es utilizar View State. ASP.NET utiliza View State para registrar los valores en los controles.
Generalmente las personas (incluso yo lo creía) creen que el View State está encriptado. Esto no es así. El View State es información serializada que después para que pueda ser almacenada en el HTML se convierte a una cadena Base-64.
Demostración:
protected void Page_Load(object sender, EventArgs e) { ViewState.Add("NicolasFerreira", "http://www.nicolasferreira.com/"); }
Salida HTML:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzDxYCHg9OaWNvbGFzRmVycmVpcmEFH2h0dHA6Ly93d3cubmljb2xhc2ZlcnJlaXJhLmNvbS9kZJUtdPnrrPUmYC4xJVygWF1HWkH4" />
Si ponemos el siguiente código:
protected void Page_Load(object sender, EventArgs e) { LosFormatter lLosFormatter = new LosFormatter(); Pair lPair = (Pair)lLosFormatter.Deserialize ("/wEPDwUJNzgzNDMwNTMzDxYCHg9OaWNvbGFzRmVycmVpcmEFH2h0dHA6Ly93d3cubmljb2xhc2ZlcnJlaXJhLmNvbS9kZJUtdPnrrPUmYC4xJVygWF1HWkH4"); ArrayList lArrayList = (ArrayList)((Pair)((Pair)lPair.First).Second).First; System.Web.UI.IndexedString lIndexedString = (System.Web.UI.IndexedString)lArrayList[0]; string lstring = (string)lArrayList[1]; }
Y analizamos el valor de la propiedad “lIndexedString.Value” y el valor de la variable “lstring” vamos a ver lo siguiente:
lIndexedString.Value = “NicolasFerreira”
lstring = “http://www.nicolasferreira.com/”
Lo que demuestra esto es que por defecto el View State no viene encriptado.
Aunque el código no se encuentre claro esto es simplemente para demostrar que el View State no viene encriptado por defecto.
Vamos a lo que nos interesa… encriptar el View State estableciendo el ajuste en el archivo Web.config (también lo podemos hacer en la directiva @Page para cada página):
<configuration> <system.web> <pages viewStateEncryptionMode="Always"/> </system.web> </configuration>
Si repetimos el primer ejemplo:
protected void Page_Load(object sender, EventArgs e) { ViewState.Add("NicolasFerreira", "http://www.nicolasferreira.com/"); }
Vamos a obtener algo como esto:
<input type="hidden" name="__VIEWSTATE" id="Hidden1" value="NjodhOfUMQ+Kgz07a092dExYHtdZWVkyuNupSqW0xvO/4lwpBtc3LbYKkBKD21GbNaxzWvLvuGfO9zSzRg7HjmL3JZlHeQVjvvHNAxKAfp0=" />
Es obvio que “value” no se ve como una cadena codificada en Base-64, por consiguiente, View State está encriptado.
Si intentamos repetir el segundo ejemplo pasando esta cadena al método Deserialize de LosFormatter vamos a obtener una excepción:
System.ArgumentException
{“Los datos serializados no son válidos.”}