Aggirare un CAPTCHA per divertimento e divulgazione – Parte 1

Cos’è un CAPTCHA e perchè si usa?

Qualunque utente Internet di questi tempi si imbatte di tanto in tanto in un CAPTCHA, ossia in un controllo dell'”umanità” di chi sta alla tastiera, come il seguente:

Esempio di CAPTCHA

Spesso mi viene chiesto: a cosa servono?
La ragione per cui moltissimi siti si dotano di CAPTCHA è la possibilità discriminare gli utenti veri da programmi automatici che potrebbero usare il sito in maniera non consona (ad esempio aprendo le sue pagine a ripetizione per danneggiarlo).

L’idea di questo fastidioso dispositivo è che si possa distinguere un umano da una macchina tramite un compito che sia:

  • facile per un uomo ma
  • difficile, o meglio impossibile per un computer

…proprio come leggere lettere distorte e senza senso! Si può infatti immaginare che un computer, non essendo intelligente, non sia in grado di leggere qualcosa di imperfetto. Ma è proprio vero?

Si possono aggirare i CAPTCHA?

Apparentemente, i CAPTCHA funzionano bene. In realtà, la distinzione tra ciò che una macchina può o non può fare rispetto all’uomo spesso non è così netta, ed è così anche per il riconoscimento ottico di oggetti come le lettere.
Esiste infatti un un intero ambito di ricerca, l’Intelligenza Artificiale, che si occupa proprio di “avvicinare” le capacità delle macchine a quelle dell’uomo. Tra gli altri interessanti ambiti dell’Intelligenza Artificiale c’è una disciplina detta OCR o Riconoscimento Ottico dei Caratteri che ha prodotto utili tecniche applicabili anche a questo problema.

Si può, allora, creare un programma basato sul’Intelligenza Artificiale per “leggere” un CAPTCHA, vanificando quindi il suo scopo?

Nella maggior parte dei casi, la risposta è un risonante SI’!
(ovviamente, a patto di dedicare un po’ d’impegno e di studio!)

Cercherò di sostenere questa tesi spiegando nel dettaglio come “battere” un CAPTCHA abbastanza semplice, quello usato dal sito di Vodafone Italia per gli SMS – con oltre il 90% di accuratezza al primo tentativo!

Chiaramente ogni CAPTCHA è un caso a sè, ma alcune idee fondamentali che illustrerò sono applicabili in generale. Nella prossima serie di articoli spiegherò l’anatomia di questo particolare CAPTCHA e di come sia riuscito a scrivere un programma che lo “legge”.

Vodafone Italia: siete in ascolto?

Aggiungo infine una nota doverosa: con questi articoli non voglio incitare il lettore ad aggirare le difese dei siti che conosce, il mio obiettivo è puramente di divulgazione dell’argomento e di sensibilizzazione sulle tematiche di sicurezza informatica. Saluto quindi calorosamente il personale Vodafone Italia, che ha tutta la mia simpatia (anche per l’ottimo trattamento che mi ha riservato durante il colloquio di lavoro): il vostro CAPTCHA era soltanto un esempio calzante, non ce l’ho con voi!

Prossimi passi

Nella seconda parte di questa serie di articoli mostrerò in dettaglio il CAPTCHA di vodafone.it ed introdurrò la tematica della riduzione del rumore, il primo passo essenziale per la lettura. Spiegherò successivamente tutti i passaggi fino ad all’interpretazione completa dell’immagine. Al termine della serie pubblicherò anche alcuni frammenti di codice Scala e Java che ho implementato e mettono in pratica le idee presentate.

Buona lettura!

4 Comments

  • GOOOOD!!

  • Ciao, bellissimo articolo. Ti volevo chiedere: Dove ti sei documentato per sviluppare tutto questo? : )

  • Le fonti sono varie: la parte sul linguaggio Scala e la libreria Encog sono principalmente tratte dai siti ufficiali. Per la parte teorica sulle reti neurali c’è il corso all’Università ed il mitico Russel-Norvig che ho menzionato. Al momento non mi viene in mente altro, volevi sapere qualche dritta su argomenti specifici?

  • […] scopo di evitare che algoritmi possano decifrarli e così scavalcarli, come ad esempio è spiegato qui), risulta difficile copiarla […]

Join the Discussion

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>