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:

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
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà

Stampa
Download



