Captcha: a Turing's legacy.

Damnit!

Chi di voi navigando non si è imbattuto in quelle confuse sequenze di lettere e numeri, talvolta così difficili da riconoscere, ma necessarie per procedere in una registrazione o in un download?

Beh, tali meccanismi di protezione prendono il nome di CAPTCHA [Completely Automated Public Turing test to tell Computers and Humans Apart], e rappresentano il metodo più semplice e al contempo robusto per tutelare applicazioni e strumenti web da un utilizzo automatico da parte di macchine.

Qualora tributassi al caro Alan Turing lo spazio necessario, resterebbe ben poco per il resto dell'articolo: mi limito a ricordarne il genio, l'amara [!] fine e una delle sue eredità più grandi: il test omonimo, capace di discernere tra uomo e macchina con semplici ed opportune domande.

A che pro tutelare qualcosa da un computer [o da un processo algoritmico astratto messo in atto in qualsiasi maniera, certo], e che rischi può comportare tale interazione? Non sarà di certo una mera sfida alle nostre diottrie! È presto detto: senza un controllo simile, il vostro blog potrebbe esser facilmente inondato di commenti, generati da poche righe di codice eseguibili su qualsiasi server senza necessità di troppa competenza. Con tutta probabilità nessuno vorrà spammare sul *vostro* blog, ma potrebbe volerlo fare su larghissima scala per ragioni di marketing virale. Bene, CAPTCHA dice no.

Scenario differente: avete un archivio di file che volete far scaricare, ma il server che lo ospita mal supporta leeching massivo: in tale maniera impedite un crawling brutale da parte di una macchina e relegate l'operazione ad un essere umano che, qualora messo di fronte ad un ulteriore controllo combinato [vedi massimo numero di tentativi / trasferimento per indirizzo IP], desisterà probabilmente.

Bene, ma come è possibile creare una barriera che risulti sia pressoché invalicabile da parte di un calcolatore ed agevole per una persona?
Facciamo l'esempio concreto in cui il visitatore Mario voglia inserire un commento circa questo post: in prima istanza, si potrebbe pensare subito ad una password; ma una parola chiave è per definizione segreta, e presuppone che Mario la conosca già! Potremmo fare una domanda, pur semplice, di cultura generale o di gossip, ma perché tagliar fuori chi non ha tale nozione o chi semplicemente non conosce la lingua utilizzata?
L'idea è quindi di fornire la "parola magica" in maniera semanticamente valida per Mario, ed incomprensibile alla macchina*: un'immagine contenente una stringa!

La sequenza alfanumerica che incontrate ogni volta è come la tana del topo: il minuscolo Mario vi entra senza problemi, il pachidermico pc pur vedendola, in prima istanza non sa proprio che farsene.
Certo, se la stringa fosse sempre la medesima, sarebbe elementare darla in pasto allo script e scardinare la difesa: l'idea è  che tale stringa deve variare ogni volta che accediamo alla pagina, in modo da rendere vano ogni tentativo di riconoscimento basato su informazioni passate; sarà sufficiente generarla in maniera casuale nella maniera che si ritiene più opportuna.

In termini di architettura client-server, Mario vede sul proprio client l'immagine generata dal server, il cui contenuto dovrà essere copiato e riinviato al server [assieme al commento ^^]. Qualora il confronto lato server tra la stringa inserita e quella generata dia esito positivo, il nostro blog si sarà sincerato della natura umana di Mario e farà del commento quel che riterrà più opportuno, verosimilmente inserirlo all'interno del database.

* è noto come molti captcha siano aggirabili senza problemi: vuoi per bug nel processo di validazione che li bypassino in tronco, vuoi per riconoscimento del testo, vuoi per brute forcing - nessuno vuole vendervi il metodo come infallibile, è solo un pretesto per scrivere un articoletto ;) .

Segue l'implementazione che io stesso ho realizzato per questa pagina.

Era mia intenzione postare il codice, probabilmente lo farò in un secondo momento.

What people said

No comments yet.

Write yours!

( * = required field. )

I want to be notified by e-mail about new comments ->