CAPTCHA ASP.NET Web Control

Se ritieni utile questo articolo, considera la possibilità di effettuare una donazione (il cui importo è a tua completa discrezione) tramite PayPal. Grazie.

Blog, sondaggi, commenti e ogni sorta di modulo di interazione tra un sito (o servizio) Web e l'utente vengono sempre più spesso utilizzati come mezzi per la diffusione di messaggi automatizzati a scopo pubblicitario o di disturbo (spam) e questo problema risulta essere tra i più sentiti negli ultimi anni.
Diventa dunque sempre più importante permettere ai nostri programmi di distinguere tra un essere umano e un altro computer; già nel 2000 i grandi portali ed i motori di ricerca iniziarono ad occuparsi del problema ed arrivarono alla creazione dei CAPTCHA, dei rompicapo di facile soluzione per un essere umano ma estremamente difficili per un sistema automatico (per maggiori informazioni si veda The CAPTCHA Project).

Introduzione

Il termine CAPTCHA denota dunque un test fatto di una o più domande e risposte per determinare se l'utente sia un umano (e non un computer o, più precisamente, un bot). L'acronimo CAPTCHA deriva dall'inglese: "completely automated public Turing test to tell'computers and humans apart" (Test di Turing pubblico e completamente automatico per distinguere computer e umani) ed è stato coniato nel 2000 da Luis von Ahn, Manuel Blum e Nicholas J. Hopper della Univerisità Carnegie Mellon e da John Langford della IBM.

Alan Turing è noto per aver decifrato, in collaborazione con Gordon Welchman, il codice Enigma della Luftwaffe; i suoi studi successivi nell'ambito dell'intelligenza artificiale portarono a quello che oggi è noto come Test di Turing.
Turing era convinto che i computer avrebbero potuto eguagliare le capacità umane e propose come criterio per la verifica dell'intelligenza non tanto la capacità di pensare, quanto la possibilità di distinguere tra un umano e una macchina.
A sostegno della sua tesi propose un "gioco di imitazione": un computer in una stanza, un uomo in un'altra e tra i due un terzo, un "interrogatore" umano, che non sa in quale delle due stanze si trovi l'uno o l'altro. Attraverso un'interfaccia testuale, l'esaminatore rivolge domande a entrambe le stanze e, quando si ritiene soddisfatto, prova a indovinare in quale stanza si trova il computer e in quale l'uomo. Se l'esaminatore si sbaglia per più di metà delle volte, il computer supera il test e deve essere considerato altrettanto intelligente dello sfidante umano.

Se il test di Turing è incentrato sul problema della capacità da parte dell'uomo di distinguere un computer da un altro essere umano, il nostro obiettivo è sostanzialmente l'inverso: realizzare un computer che sia in grado di distinguere un essere umano da un altro computer. Per questo motivo si definiscono i test CAPTCHA come test di Turing inversi (Reverse Turing Test, RTT), sebbene la definizione possa essere ritenuta fuorviante, perché potrebbe indicare anche un test di Turing in cui entrambi i partecipanti tentano di provare che non sono umani.

Un test CAPTCHA tipicamente utilizzato è quello in cui si richiede ad un utente di scrivere quali siano le lettere o numeri presenti in una sequenza di lettere o numeri che appaiono distorti o offuscati sullo schermo ed è proprio quello che useremo nel CAPTCHA Web Control presentato in questo articolo.

Test CAPTCHA in ASP.NET

In ASP.NET non è disponibile un controllo nativo dell'interazione umana (i test CAPTCHA sono noti anche con l'acronimo HIP, Human Interactive Proof); per realizzarne uno servono fondamentalmente tre elementi:

  1. la visualizzazione del test (il rompicapo) vero e proprio, realizzato tramite l'inserimento di un web control (VisualCaptcha) in un Web Form. Questo controllo verrà renderizzato da un HttpHandler (VisualCaptchaHandler) come immagine contenente il testo (generato casualmente) distorto da individuare.

  2. la raccolta della risposta da parte dell'utente, inserita in una normale casella di testo (TextBox) presente nel Web Form.

  3. la visualizzazione del risultato del test (corretto o non corretto), implementato con un controllo di convalida ASP.NET personalizzato (VisualCaptchaValidator).

La logica di funzionamento è relativamente semplice: le informazioni di rappresentazione dell'immagine per la verifica (dimensioni, numero di caratteri da visualizzare e stile) vengono impostate nel VisualCaptcha control inserito nella pagina. Eseguendo la pagina viene generato un codice casuale e le informazioni (VisualCaptchaMetaData) vengono salvate nella cache di ASP.NET, con la scadenza definita dal tempo limite per la soluzione del test. L'handler, recuperando le informazioni dalla cache, visualizzerà l'immagine per la prova e, all'invio della richiesta (page postBack), la risposta immessa dall'utente verrà verificata secondo il normale workflow di validazione di ASP.NET tramite il VisualCaptchaValidator control.

VisualCaptcha

Il nostro rompicapo sarà rappresentato da un WebControl da inserire nel Web Form, definito nella classe VisualCaptcha.

Nome Descrizione
ChallangeTextLength Imposta il numero di caratteri del codice casuale da individuare
Expiration Esprime il tempo massimo (in secondi) per la risoluzione del test CAPTCHA (questo valore viene utilizzato per impostare la durata dei metadati nella cache). Se Expiration <= 0 la scadenza è disabilitata
IgnoreCase Indica se la soluzione del test CAPTCHA sarà valutata tenendo conto delle differenze tra caratteri maiuscoli e minuscoli (IgnoreCase = false) o in modalità case-insensitive (IgnoreCase = true)
RenderUrl Url usato per il render dell'immagine sul client (definito del Web.config)
Authenticate Verifica che il codice immesso dall'utente corrisponda al codice di controllo

Le informazioni del WebControl utili per la sua rappresentazione grafica (testo e dimensioni) vengono salvate nella cache di ASP.NET come VisualCaptchaMetaData.

Per la visualizzazione vera e propria dell'immagine con il testo distorto implementiamo un HttpHandler (VisualCaptchaHandler) che, sulla base della Guid ricevuta in QueryString, recupererà i dati necessari dalla cache.

VisualCaptchaValidator

Per verificare il risultato del test verrà confrontato il codice inserito dall'utente con quello mostrato nell'immagine. La verifica avverrà nel ciclo di vita della pagina ASP.NET, tramite la validazione del Web Form mediante l'utilizzo del VisualCaptchaValidator.

Nome Descrizione
AssociatedVisualCaptchaControlId Imposta l'ID del controllo VisualCaptcha associato al validatore

NOTA: le tabelle precedenti mostrano solo le caratteristiche principali dei controlli. Per l'interfaccia pubblica completa si rimanda alla documentazione in linea o alla guida allegata.

Per i dettagli implementativi si rimanda al codice sorgente della libreria allegato a questo articolo.

Aggiungere CAPTCHA ad un Web Form

Per inserire il test CAPTCHA ad un Web Form ASP.NET è necessario:

  1. Aggiungere un riferimento alla libreria GURU4.net.Web.Controls.CaptchaLibrary.dll nella cartella "bin" del nostro progetto Web

  2. Aggiungere nel file di configurazione dell'applicazione (web.config) l'handler HTTP per la visualizzazione dell'immagine:

    <?xml version="1.0"?>
    <configuration>
        <system.web>
            <httpHandlers>
                <add verb="GET" path="visualcaptcha.axd" type="GURU4.net.Web.Controls.CaptchaLibrary.VisualCaptchaHandler" />
            </httpHandlers>
        </system.web>
    </configuration>
  3. Registrare l'assembly "GURU4.net.Web.Controls.CaptchaLibrary" nella pagina che conterrà il test CAPTCHA:

    <%@ Register Assembly="GURU4.net.Web.Controls.CaptchaLibrary" Namespace="GURU4.net.Web.Controls.CaptchaLibrary" TagPrefix="ccl" %>
  4. Inserire i controlli richiesti (VisualCaptcha, VisualCaptchaValidator ed una TextBox) nel Web Form:

    <ccl:VisualCaptcha ID="visualCaptchaControl" runat="server" Width="260" Height="80" />

    <ccl:VisualCaptchaValidator ID="visualCaptchaValidator" AssociatedVisualCaptchaControlId="visualCaptchaControl" ControlToValidate="txtCaptcha" ErrorMessage="Inserire correttamente il codice visualizzato nell'immagine" runat="server" />

    <asp:TextBox ID="txtCaptcha" runat="server" />

NOTA: utilizzando Microsoft Visual Studio è possibile aggiungere la libreria di controlli direttamente alla Toolbox, rendendo così possibile l'inserimento dei controlli CAPTCHA tramite drag&drop

A titolo esemplificativo, di seguito viene proposto un screenshot che mostra il controllo Visual CAPTCHA inserito in un form di registrazione account:

Il controllo Visual CAPTCHA inserito in una Web Form ASP.NET

Per maggiori informazioni si rimanda al progetto Web d'esempio allegato a questo articolo.

Limiti dei test CAPTCHA

I test CAPTCHA visuali hanno sostanzialmente due limitazioni:

  1. VIOLABILITÀ: la protezione fornita da questo tipo di test non è particolarmente elevata (diversi tentivi di violazione dei rompicapo CAPTCHA hanno fatto registrare percentuali di successo elevatissime, prossime al 100%!)

    Sebbene la sicurezza sia piuttosto bassa, è comunque opportuno considerare che l'inserimento di un test di interazione umana frappone comunque un ostacolo tra il pirata informatico ed il nostro software, un deterrente che spesso è decisamente sufficiente.

  2. ACCESSIBILITÀ: i test CAPTCHA visuali sono basati sulla capacità degli utenti di visualizzare ed interpretare il contenuto di un'immagine. Risulta di conseguenza che un utente ipovedente non è in grado di risolvere il rompicapo; in alcuni casi il problema potrebbe essere anche più diffuso: un'immagine con tonalità di rosso e verde creerebbe problemi anche a persone affette da daltonismo, disturbo che affligge circa il 10% della popolazione maschile.

    Il consorzio W3C ha pubblicato il documento Inaccessibility of CAPTCHA in cui viene approfondita questa problematica.

    In linea generale sarebbe opportuno fornire all'utente una modalità di verifica alternativa, ad esempio tramite l'ascolto ed il riconoscimento di un testo pronunciato (come già implementato da alcuni grandi portali) o tramite l'analisi di un quesito logico.

Approfondimenti

Per un'analisi più approfondita è possibile consultare l'ottimo articolo Un framework ASP.NET per le Human Interactive Proof pubblicato da Stephen Toub su MSDN.