Criptare i dati inviati ai moduli

Criptazione delle query string con ASP.NET

Una query string è solitamente un URL contenente dei parametri con relativi valori che il browser invia ad un'applicazione web (solitamente lato server). L'uso di tale tecnica per passare dati dal browser al server è piuttosto nota ed utilizzata. Tuttavia, concedere la possibilità agli utenti di modificare una query string "in chiaro" , può costituire una minaccia alla sicurezza del vostro server.

Per questo motivo in quest' articolo si incoraggiano gli sviluppatori a criptare le query string, anche se queste non contengono dati confidenziali. Ovviamente ci sono ancora possibilità di modificare le query string, ma tramite un'appropriata gestione degli errori questa possibilità diviene innocua.

Per mantenere quest'articolo semplice, verrà usato l'algoritmo di criptazione DES, sebbene sia possibile sostituirlo facilmente con algoritmi più robusti.

Uno sguardo al codice

La parte principale della soluzione principale consiste in un modulo denominato HttpModule che decripta la query string e quindi soddisfa la richiesta del browser tramite un'ordinaria query string in chiaro:

<a href="iframe_queryasp1.html" title="Vedi esempio">Vedi codice</a>;
using System;  
using System.Web;  
using System.Web.Configuration;    

namespace SmartSoft.QueryStringEncryption  {      

/// <summary>      
/// Modulo HTTP che gestisce le query string criptate
/// </summary>      

public class CryptoQueryStringUrlRemapper : IHttpModule {


#region IHttpModule Members            
/// <summary>          
/// Inizializzazione del modulo.      
/// </summary>          
/// <param name="application">Applicazione che          
/// ha richiamato questo modulo.</param>          

public void Init(HttpApplication application)  {  

    // Si appende la richiesta riguardo all'evento
   // per catturare la query string            
    application.AcquireRequestState += application_AcquireRequestState;          
}           

public void Dispose()  {}                
#endregion            

/// <summary>         
/// L'evento che viene richiamato quando l'applicazione acquisice la richiesta di stato
/// </summary>          
/// <param name="sender"></param>          
/// <param name="e"></param>          

    public void application_AcquireRequestState(object sender, EventArgs e)  {
        // Get http context from the caller.              
        
        HttpApplication application = (HttpApplication) sender;              
        HttpContext context = application.Context;                
        
        // Controllo per la query string criptata      
        string encryptedQueryString = context.Request.QueryString["request"];              
        if (!string.IsNullOrEmpty(encryptedQueryString))   {
            // Decrypt query strings                  
            string cryptoKey = WebConfigurationManager.AppSettings["CryptoKey"];
            string decryptedQueryString =  CryptoQueryStringHandler.DecryptQueryStrings(encryptedQueryString,cryptoKey);
           context.Server.Transfer(context.Request.AppRelativeCurrentExecutionFilePath +                     
                                    "?" + decryptedQueryString);              
        }          
    }      
  }  
}

Come potete aver notato, se c'è una query string criptata per la richiesta corrente, il modulo termina automaticamente l'esecuzione della pagina corrente e inizia internamente l'esecuzione di una nuova richiesta per il server.

Il prossimo passo consiste nel registrare il modulo HttpModule nel file web.config:

<httpModules>
  <add name="CryptoQueryStringUrlRemapper"  
       type="SmartSoft.QueryStringEncryption.CryptoQueryStringUrlRemapper"/>
</httpModules>

Ultimo passo, non dobbiamo dimenticare di criptare le query string prima di spedirle indietro al server:

private void PrepareSendButton()  {
      NameValueCollection queryStrings = new NameValueCollection();
      queryStrings.Add("param1" , "Test1");      
       queryStrings.Add("param2" , "Test2");      
      queryStrings.Add("param3" , "Test3");        

       
      // Encrypt query strings      
      string encryptedString = CryptoQueryStringHandler.EncryptQueryStrings(queryStrings, 
                               WebConfigurationManager.AppSettings["CryptoKey"]);      
      btnSendParams.PostBackUrl = string.Concat("~/Default.aspx?" , encryptedString);  
}

 

<a href="iframe_queryasp1.html" title="Vedi esempio">Vedi codice</a>;

 

Come abbiam sottolineato in precedenza, la classe che gestisce la criptazione può essere facilmente rimpiazzara da una classe diversa con compito analogo.

N.B.: il metodo DecryptQueryStrings in CryptoQueryStringHandler contiene la seguente linea di codice:

return Encryption64.Decrypt(encryptedStrings.Replace(" " , " + "), key);

Per cause ignote, la richiesta rimpiazza ogni carattere '+ ' nella query con un carattere vuoto.

SCARICA IL CODICE (Licenza CPOL).

 

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Sara
Hai dubbi su questo articolo?