Crittografia di ViewState in ASP.NET 2.0

 

Matt Gibbs
Development Lead—Web Platform & Tools

Dicembre 2005

Riassunto: Per ridurre la possibilità che qualcuno intercetti le informazioni memorizzate in ViewState, è buona norma crittografare ViewState. Ciò era già possibile nelle versioni precedenti di ASP.NET, ma in ASP.NET 2.0 il supporto della crittografia è stato migliorato e consente ora di definire questa impostazione a livello di pagina (3 pagine stampate).

Nelle versioni precedenti di ASP.NET, lo sviluppatore di pagine aveva la possibilità di attivare e disattivare la crittografia a livello di applicazione per mezzo di un'impostazione di configurazione. Quando la convalida veniva impostata su 3DES, ViewState veniva crittografato prima di essere generato nella pagina.

<configuration>
   <system.web>
      <machineKey validation="3DES" />
   </system.web>
</configuration>
 

In ASP.NET 2.0 è stato esteso il controllo e l'utilizzo della crittografia. Le impostazioni di crittografia ora possono essere controllate separatamente per ciascuna pagina. Inoltre, i controlli nella pagina possono richiedere che la crittografia venga utilizzata per ViewState. Tale richiesta può però essere ignorata dall'impostazione della pagina. L'enumerazione ViewStateEncryptionMode dispone di tre valori: Auto, Always e Never. Il valore predefinito è Auto.

  • ViewStateEncryptionMode.Auto

    In questa modalità, ASP.NET crittograferà ViewState per una pagina se un qualsiasi controllo presente al suo interno lo richiede. Notare che ciò significa la crittografia dell'intero ViewState, non solo della parte relativa al controllo richiedente. I costi in termini di prestazioni associati alla crittografia sono in gran parte riconducibili all'overhead. Pertanto la crittografia dell'intero ViewState è più veloce rispetto a operazioni separate nel caso in cui più di un controllo effettui la richiesta.

  • ViewStateEncryptionMode.Never

    Come prevedibile, in questa modalità ASP.NET non crittograferà ViewState, anche se l'applicazione è impostata per la crittografia e i controlli nella pagina ne hanno fatto richiesta. Se nella pagina non vi sono dati da crittografare, sarà preferibile impostare la modalità su Never. Tuttavia, è improbabile che dalla documentazione relativa ai controlli sia possibile risalire a ciò che viene salvato in ViewState. Di conseguenza, sarà opportuno prestare attenzione nel caso vi sia la possibilità che dati riservati vengano esposti.

  • ViewStateEncryptionMode.Always

    In questa modalità, ASP.NET non attende che un controllo nella pagina richieda la crittografia. ViewState viene sempre crittografato. Quando si utilizzano dati riservati, è buona norma utilizzare la crittografia.

La modalità è una proprietà nella pagina, ma viene impostata mediante una direttiva di pagina o nel file web.config dell'applicazione.

<%@Page ViewStateEncryptionMode="Always" %>

Oppure

<configuration>
   <system.web>
      <pages ViewStateEncryptionMode="Always" />
   </system.web>
</configuration>

La scrittura di un controllo personalizzato che richiede la crittografia di ViewState è molto semplice. Il nome del metodo Page da chiamare è RegisterRequiresViewStateEncryption.

protected override void OnInit(EventArgs e) {
    base.OnInit(e);
    if(Page != null) {
        Page.RegisterRequiresViewStateEncryption();
    }
}

Gli sviluppatori di controlli devono essere consapevoli dell'overhead e delle potenziali implicazioni a livello di prestazioni derivanti dall'impiego della crittografia e non devono prendere con leggerezza questo tipo di decisione. Va notato che questa opzione deve essere considerata una richiesta malgrado il nome API faccia pensare a una sua obbligatorietà. Se gli sviluppatori di controlli sanno in qualche modo che i dati da memorizzare in ViewState devono essere crittografati, hanno la possibilità di aggiungere del codice per generare un'eccezione nel caso lo sviluppatore della pagina disattivi la crittografia.

protected override void SaveViewState() {
    if(Page != null) {
        if(Page.ViewStateEncryptionMode == ViewStateEncryptionMode.Never) {
            throw new Exception(“ViewStateEncryptionMode.Never 
not allowed when using the SensitiveDataList control."); } } }

 

Informazioni sull'autore

Matt Gibbs è un importante Software Design Engineer nel team di ASP.NET in Microsoft, dove ha collaborato alle tecnologie di sviluppo Web fino dal 1997. Ha scritto in collaborazione vari libri su ASP e ASP.NET.

Mostra: