Capire e decodificare il ViewState di ASP.NET

2 pagine in totale: <<Indietro 1 [2]

La sicurezza del ViewState

E' necessario anche non memorizzare in esso dati sensibili, come password, perché ciò renderebbe ovviamente molto facile lo spoofing di un malintenzionato.

ASP.NET mette comunque a disposizione funzioni in più per la sicurezza del ViewState.

Come prima opzione, è possibile abilitare il MAC , attraverso la direttiva:

<%@ Page EnableViewStateMac="true" %>

In pratica è che un meccanismo che aggiunge un codice di controllo finale, che verrà confrontato ad ogni postback per garantire che il ViewState sia corretto.

E' possibile, ancora, abilitare la criptazione . E' necessario modificare il tag machineKey del machine.config, aggiungo il tipo di validazione:

<machineKey validation="3DES"...

Da questo punto in poi, il ViewState sarà criptato durante l'invio al browser. In questo modo risulta quasi impossibile decodificare il view state perché l'utente non possiede la chiave di codifica, come si può notare in questa immagine, dove in azione c'è un ViewState decoder:

Immagine

Ovviamente queste opzioni aumentano il numero di operazioni che il framework deve eseguire e portano ad un rallentamento dell'esecuzione della nostra applicazione.

Cambiare il supporto di salvataggio delle informazioni

Come abbiamo già detto, il ViewState occupa spazio nella pagina HTML. Provate ad utilizzare un DataGrid di normali dimensioni e noterete quanto codice venga aggiunto per gestire lo stato.

Per affrontare in modo migliore il problema della dimensione del ViewState si può prendere in considerazione la possibilità di cambiare il supporto nel quale vengono salvate le informazioni.

E' possibile farlo associando la nostra pagina ad una classe personalizzata, che erediti dalla classe Page e sovrascriva i metodi LoadPageStateFromPersistenceMedium e SavePageStateToPersistenceMedium.

A questo punto potremmo alleggerire il carico della pagina da inviare all'utente, ad esempio salvando queste informazioni sul disco del server, oppure all'interno di una variabile di Sessione, come in questo esempio in C# (nell'allegato è contenuta la versione VB.NET):

public class SessionViewState:Page
{

  protected override object LoadPageStateFromPersistenceMedium()  {
   Trace.Warn("load2");
   //decodifico il view state prelevandolo dalla session
   LosFormatter formatter = new LosFormatter();
   Trace.Warn("load "+Session["state"]);
   object vs=Session["state"];
   if (vs!=null)
   return formatter.Deserialize(vs.ToString());
   else
   return null;
  }
  protected override void SavePageStateToPersistenceMedium(object ViewStateBag){
   //codifico il view state tramite il suo serializzatore
   StringWriter stream = new StringWriter();
   LosFormatter formatter = new LosFormatter();
   formatter.Serialize(stream, ViewStateBag);
   string state=stream.ToString();
   stream.Close();
   //lo salvo nella sessione
   Session["state"]=state;
   Trace.Warn("Save "+state); }
}

Il codice non è molto complesso ed è ampiamente commentato, in modo da poter essere espandibile senza troppi problemi.

Utilizziamo sempre LosFormatter per minimizzare la dimensione del ViewState, ma lo memorizziamo all'interno di una variabile Session.

Una volta creata questa classe ci basterà riutilizzarla ereditandola all'interno delle nostre pagine (un po' come si fa con il code-behind).

Nulla vieta di memorizzare il ViewState su un database o su files, basta considerare che bisogna identificare il ViewState dell'utente in modo da renderlo univoco.

Conclusioni

Utilizzando la session, poi, si risolvono due problemi:

  • l'univocità del view state per ogni utente (la sessione è unica per ogni utente)
  • la cancellazione automatica del view state qualora l'utente non navighi più nel nostro sito.

Come avrete intuito anche questa soluzione ha però un limite: la sessione va a pesare sulle risorse del nostro server, consumando memoria.

Ritengo che conoscere in fondo come ASP.NET lavori sia di fondamentale importanza per sfruttare al meglio l'ambiente, dunque si tratta di scegliere l'opzione migliore anche in base al carico della proprio applicazione web.

In allegato c'è un applicazione winform (con relativi sorgenti) per decodificare il view state inserendo l'indirizzo di una pagina ASP.NET.

Vi suggerisco di utilizzarla: capirete con un po' di prove il funzionamento di questo tipo di meccanismo. Buon divertimento!

2 pagine in totale: <<Indietro 1 [2]

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC