Gli HTTP Modules

di: Giuseppe Marchi     11 Aprile 2007

Un HTTP Module per prevenirsi dallo SPAM

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.

Conclusioni

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.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto