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:
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);
}
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).
- Articolo precedente Inviare email con allegati
- Articolo successivo Visual Studio 2008 e .NET Framework 3.5 Service pack 1 scaricabili gratis. Novità, funzioni e miglioramenti