Crittografare ViewState in ASP.NET 2.0

 

Matt Gibbs
Responsabile sviluppo- Strumenti della piattaforma & Web

Dicembre 2005

Riepilogo: Per ridurre la probabilità che un utente intercetta le informazioni archiviate in ViewState, è consigliabile crittografare viewState. È possibile eseguire questa operazione nelle versioni precedenti di ASP.NET, ma il supporto per la crittografia è stato migliorato in ASP.NET 2.0, consentendo di impostarlo in base alla pagina. (3 pagine stampate)

Nella versione precedente di ASP.NET, lo sviluppatore di pagine potrebbe attivare e disattivare la crittografia a livello di applicazione tramite un'impostazione di configurazione. Quando la convalida è stata impostata su 3DES, ViewState è stata crittografata prima del rendering nella pagina.

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

In ASP.NET 2.0 il supporto per il controllo e l'uso della crittografia è stato ampliato. Le impostazioni di crittografia possono ora essere controllate separatamente per ogni pagina. Inoltre, i controlli nella pagina possono richiedere l'uso della crittografia per ViewState, ma anche questa richiesta può essere sostituita dall'impostazione della pagina. L'enumerazione ViewStateEncryptionMode ha tre valori: Auto, Always e Never. Il valore predefinito è Auto.

  • ViewStateEncryptionMode.Auto

    In questa modalità, ASP.NET crittograferà ViewState per una pagina se un controllo nella pagina lo richiede. Si noti che questo significa che tutti gli oggetti ViewState sono crittografati, non solo viewState per il controllo che lo richiede. Gran parte del costo delle prestazioni associato alla crittografia è dovuto al sovraccarico. La crittografia dell'intero viewState è quindi più veloce rispetto all'esecuzione di operazioni di crittografia separate se più di un controllo effettua la richiesta.

  • ViewStateEncryptionMode.Never

    Come previsto, in questa modalità ASP.NET non crittograferà ViewState, anche se l'applicazione è impostata per la crittografia e i controlli nella pagina l'hanno richiesto. Se si sa che non è necessario crittografare i dati coinvolti nella pagina, potrebbe essere possibile impostare la modalità su Mai. Tuttavia, a questo punto è raro che la documentazione relativa a un controllo di divulgare ciò che viene salvato in ViewState, quindi è consigliabile prestare attenzione se è possibile che i dati sensibili possano essere esposti.

  • ViewStateEncryptionMode.Always

    In questa modalità, ASP.NET non attende che un controllo nella pagina richieda la crittografia. ViewState è sempre crittografato. Quando si usano dati sensibili, è consigliabile usare la crittografia.

La modalità è una proprietà nella pagina, ma viene impostata usando una direttiva page o nel file di web.config per l'applicazione.

<%@Page ViewStateEncryptionMode="Always" %>

Oppure

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

È semplice per un utente che scrive un controllo personalizzato per richiedere la crittografia ViewState. 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 del sovraccarico e delle potenziali implicazioni dell'uso della crittografia e non devono prendere la decisione di richiedere la crittografia in modo leggero. Si noti che si fa riferimento a esso come richiesta, anche se il nome dell'API sembra essere un mandato. Se gli sviluppatori del controllo sanno in qualche modo che i dati archiviati in ViewState devono essere crittografati, potrebbero aggiungere codice per generare un'eccezione nel caso in cui lo sviluppatore della pagina disattiva 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 responsabile del design del software nel team di ASP.NET di Microsoft, dove ha lavorato sulle tecnologie di sviluppo Web dal 1997. Ha coautore diversi libri su ASP e ASP.NET.

© Microsoft Corporation. Tutti i diritti sono riservati.