Un'implementazione molto particolare degli HTTP Module è quella di poter filtrare la pagina di risposta, e modificarne l'output a nostro piacimento. Possiamo, per esempio, cercare tramite una regular expression, tutti gli indirizzi e-mail inseriti nelle pagine e riscriverli, in modo tale che non possano essere utilizzati dagli agenti di spam.
Questo tipo di tecnica risulta molto utile in siti gia avviati e di grosse dimensioni, in quanto basta modificare solo una piccola parte dell'applicazione, per poter poi filtrare in automatico tutte le pagine che essa contiene.
Il filtro da realizzare, deve prendere lo stream di risposta e modificarlo. Il codice del filtro verrà omesso, in quanto non inerente all'argomento principale dell'articolo; i sorgenti sono disponibili però per il download.
La cosa interessante, cui porre attenzione, è l'evento che dobbiamo catturare per l'inserimento del nostro filtro personalizzato. L'evento in questione è il ReleaseRequestState. Perché proprio questo? Semplice, perché negli eventi scatenati prima, non era presente ancora il rendering dei controlli web di ASP.NET, e la pagina risultava ancora vuota.
using System;
using System.Web;
public class NoSpamModule : IHttpModule
{
public void Dispose() {}
public void Init(HttpApplication context)
{
context.ReleaseRequestState += new EventHandler(OnReleaseRequestState);
}
void OnReleaseRequestState(object sender, EventArgs e)
{
HttpResponse response = HttpContext.Current.Response;
if (response.ContentType == "text/html")
response.Filter = new SpamFilter(response.Filter);
}
}
Il fulcro del nostro filtro anti-spam (la classe SpamFilter), è rappresentato dall'override del metodo Write, proprio della classe padre Stream. Questo metodo preleva i dati della risposta corrente e cerca ogni occorrenza di un link con all'interno un indirizzo e-mail, tramite l'utilizzo delle regular expression; per ogni collegamento trovato, si occupa poi di sostituire la chiocciola (@) con la parola (at) e il punto (.) con la parola (dot).
public override void Write(byte[] buffer, int offset, int count)
{
StringBuilder html = new StringBuilder();
string strBuffer = UTF8Encoding.UTF8.GetString (buffer, offset, count);
Regex fine = new Regex ("</html>", RegexOptions.IgnoreCase);
if (!fine.IsMatch(strBuffer))
{
html.Append(strBuffer);
}
else
{
html.Append(strBuffer);
string finalHtml = html.ToString();
string pattern = @"(mailto:|)(\w+[a-zA-Z0-9.-_]*)@(\w+).(\w+)";
Regex re = new Regex(pattern, RegexOptions.IgnoreCase);
finalHtml = re.Replace(finalHtml, new MatchEvaluator(MailMatch));
byte[] data = UTF8Encoding.UTF8.GetBytes (finalHtml);
responseStream.Write (data, 0, data.Length);
}
}
Una volta registrato questo HTTP Module all'interno del web.config dell'applicazione web, ogni pagina richiesta verrà filtrata e cambierà tutti gli indirizzi e-mail presenti, in modo tale da renderli irriconoscibili per gli agenti di spam.
Questo articolo ha voluto offrire una panoramica su uno degli argomenti più importanti riguardo la pipeline di esecuzione di ASP.NET; ma non ha certo esaurito il tema poiché, anche qui, le possibili implementazioni di un HTTP Module sono pressoché infinite. Quelle che risultano essere le più utilizzate sono implementazioni di url rewriting, filtri sulla risposta al client, azioni personalizzate sulla gestione della sessione e della cache o implementazioni di meccanismi di autenticazione e autorizzazione custom, però nulla ci vieta di inventarci le funzionalità custom proprie per le esigenze delle nostre applicazioni web.
Guida Windows Azure Code SnippetsLe migliori pratiche per far girare le applicazioni "in the cloud",... |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Corso Progettazione database11 Maggio 2012 a Milano |
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |