In questo post si parlerà di tecniche atte a mettere in sicurezza i vari tipi di stati che una normale web application può trovarsi a gestire.

Securing ViewState

Se la nostra Web Application utilizza il viewstate è bene considerare di:

Assicurarsi dell'integrità del messaggio, per far questo è bene abilitare il direttiva enableViewStateMac a true.

<% @ Page enableViewStateMac=true >

Questo comporta la generazione di un Message Authentication Code (MAC) da parte di ASP.NET, durante l'evento postback.

Configurare l'attributo validation presente nel machine.config , per specificare il tipo di criptaggio che sarà utilizzato per la validazione dei dati. (SHA1- 3DES per esempio). Ricordiamo che SHA1 (Secure Hash Algorithm 1) produce un hash di dimensioni decisamente superiori a quelle che può produrre MD5 (Message Digest 5), per questo fattore spesso viene considerato maggiormente.

Utilizzare 3 Data Encryption (3DES) per verificare eventuali cambiamenti al viewstate e anche per criptarlo durante la sua fase di transito.

Securing Cookies

Per i cookie che contengono dati di autentificazione o autorizzazione o altri dati personali, questo dovrebbero essere sicuramente messi in sicurezza tramite SSL durante la loro fase di transito. Per le Forms Authentication, il metodo FormsAuthentication.Encrypt può essere utilizzato per criptare i ticket di autorizzazione, i quali poi verranno inviato dal server al client et viceversa.

Securing SQL Session State

L in process session state Handler di ASP.NET ha sicuramente delle limitazioni. Per esempio, non può lavorare su più computers in un ambiente Web Farm. Per passare il problema, ASP.NET fornisce la possibilita di archiviare i session state in un Database di Microsoft SQL Server.
SQL Session state può, naturalmente, essere configurato sia nel Machine.Config che nel Web.Config

Lo script sql utilizzato per creare il database di default è installato nella seguente path
c:\winnt\microsoft.net\framework\<version> dove <version> sta per la versione del framework da voi installato.

Ci sono due problematiche da considerare quando si decide di utilizzare SQL Session State.

1. Mettere in sicurezza la connection string che punta al database
2. Mettere in sicurezza il session state condiviso all'interno del network.

Securing Database Connection String

Se si utilizza SQL Authentication per connettersi al server, la connection string specificata nell'attributo sqlConnectionString conterrà una username ed una password. In questo caso, come detto più volte nei post precedenti andiamo ad utilizzare aspnet_setreg.exe.

Ma è assolutamente da considerare il fatto di utilizzare la Windows Authentication per connetersi al database. Il vantaggio è negli occhi di tutti, nessuna stringa di connessione conterrà username e/o password e aspnet_setreg.exe potrà essere tralasciato.

Per migliorare ulteriormente le cose è possibile utilizzare il process identity di ASP.NET per effettuare le Windows Authentication nei confronti di un database SQL Server.
Per far questo è necessario:

Creare un duplicato dell'account (con medesima username e password) nel server database.
Creare un SQL login account
Mappare l'utente al database ASPState.
Crare un ruole all'interno del database, aggiungere l'utente al ruole.
Configurare le permissions nel database per il ruolo in cui l'utente è stato inserito.

A questo punto è possibile trasformare la connection string per passare in modalità Trusted Connection come sotto scritto

sqlConnectionString="server=127.0.0.1;
                     database=StateDatabase;
                     Integrated Security=SSPI;"

Securing Session State Across the Network

Questa è sicuramente la parte meno importante del post.
Diciamo che l'idea di proteggere SQL Session State durante il traffico all'interno del network può essere una buona idea..

E' da considerare buona l'idea di utilizzare IPSec per proteggere tutto il traffico tra WebServer e Sql Server, o alternativamente, possiamo utilizzare SSL per mettere in sicurezza i link relativi a SQL Server, applicando questa tecnica è possibile criptare la connessione utilizzata per il session state e non tutto il traffico.