Criptare i dati inviati ai moduli

Criptazione delle query string con ASP.NET

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

Per questo motivo in quest' articolo siincoraggiano gli sviluppatori a criptare le query string,anche se queste non contengono dati confidenziali. Ovviamenteci sono ancora possibilità di modificare le querystring, ma tramite un'appropriata gestione degli erroriquesta possibilità diviene innocua.

Per mantenere quest'articolosemplice, verrà usato l'algoritmo di criptazioneDES, sebbene sia possibile sostituirlofacilmente con algoritmi più robusti.

Uno sguardo al codice

La parte principale della soluzioneprincipale consiste in un modulo denominatoHttpModule che decripta la query string e quindisoddisfa la richiesta del browser tramite un'ordinariaquery string in chiaro:

<a href="iframe_queryasp1.html" title="Vedi esempio">Vedicodice</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 stringsstring cryptoKey = WebConfigurationManager.AppSettings["CryptoKey"];string decryptedQueryString =  CryptoQueryStringHandler.DecryptQueryStrings(encryptedQueryString,cryptoKey);     context.Server.Transfer(context.Request.AppRelativeCurrentExecutionFilePath +   "?" + decryptedQueryString);    }  }  }  }

Come potete aver notato, sec'è una query string criptata per la richiestacorrente, il modulo termina automaticamente l'esecuzionedella pagina corrente e inizia internamente l'esecuzionedi una nuova richiesta per il server.

Il prossimo passo consiste nelregistrare il modulo HttpModule nel fileweb.config:

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

Ultimo passo, non dobbiamo dimenticaredi criptare le query string prima di spedirle indietro alserver:

private void PrepareSendButton()  {NameValueCollection queryStrings = new NameValueCollection();queryStrings.Add("param1" , "Test1"); queryStrings.Add("param2" , "Test2");queryStrings.Add("param3" , "Test3");   // Encrypt query stringsstring encryptedString = CryptoQueryStringHandler.EncryptQueryStrings(queryStrings,  WebConfigurationManager.AppSettings["CryptoKey"]);btnSendParams.PostBackUrl = string.Concat("~/Default.aspx?" , encryptedString);  }

 

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

 

Come abbiam sottolineato inprecedenza, la classe che gestisce la criptazione puòessere facilmente rimpiazzara da una classe diversa concompito analogo.

N.B.: il metodoDecryptQueryStrings inCryptoQueryStringHandler contiene la seguentelinea di codice:

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

Per cause ignote, la richiestarimpiazza ogni carattere '+ ' nella query con uncarattere vuoto.

SCARICA IL CODICE (Licenza CPOL).