Ci sbattiamo sempre davanti. A volte son semplici altre volte quasi illeggibili, ma son sempre utili per evitare che i soliti bot programmati ad arte, riempiano di spam i nostri blog, o intasino le nostre caselle email collegate a form di contatto di proposte di acquisto viagra et simila.
Ma come funziona nei fatti un captcha? La logica è abbastanza semplice. Qualsiasi cosa che sia interpretabile dall’occhio umano e non da una macchina. Un’immagine con del testo scritto sopra per i bot è un’immagine tout court, mentre per una persona reale è qualcosa da leggere e da cui estrapolare informazioni. E’ vero che ora esistono anche bot che riescono a leggere il testo incluso nelle immagini, ma ci sono contromisure efficaci, come quelle di usare caratteri non troppo facili da leggere, oppure inventarsi dei captcha complessi, come il risultato di un’operazione matematica. Nei fatti un captcha è tanto più efficace quanto pochi sono i siti che lo implementano. Questo perchè si deve sempre far riferimento ad una procedura standard, che se generalizzata ha maggiori probabilità di essere scritta in linguaggio macchina e quindi interpretata anche dagli spammer bot.
Ma torniamo a noi e riflettiamo per un secondo la logica che deve avere un captcha. Abbiamo detto che deve rappresentare un’istruzione umana in un contesto macchina differente da quello standard. Quindi, il testo scritto su un’immagine ci permette di ottemperare a questa logica. E’ però vero che un captcha deve essere verificato da una macchina, dal server a cui si invia la richiesta. Quindi ci serve far in modo che l’istruzione prettamente umana, sia passata precedentemente in qualche modo al server che dovrà verificarla, ovviamente in modalità per lui gestibili. Ma non basta, un captcha efficace ha necessità di mostrare un output omogeneo nella forma, ma sempre diverso nella sostanza.
Una soluzione è l’uso delle variabili di sessione. Cookie che si scrivono sul server è che rimangono nella disponibilità di questo fino alla fine della sessione.
Per cui, ricapitolando basterà creare un’immagine con del testo all’interno. Testo che dovrà cambiare ad ogni nuova richiesta, quindi casuale, ma che dovrà essere verificato ogni volta dal server. Questo si traduce in una variabile di sessione che dovrà essere uguale al testo riportato sull’immagine. Sembra complicato, ma bastano poche righe di codice. Vediamo un esempio in php.
$string = ‘ABCDEFGHKLMNPRSTUVWYZabcdefghklmnprstuvwyz0123456789’;
$a = 0;
while($a <= 4){
$randomstring .= $string{rand(0, strlen($string)-1)};
$a++;
}
$im = imagecreatetruecolor(100, 15);
$bg = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, 100, 15, $bg);
$tc = imagecolorallocate($im, 0, 0, 255);
imagestring($im, 5, 15, 0, $randomstring, $tc);
$_SESSION[‘captcha’] = $randomstring;
header(‘Content-type: image/jpg’);
imagejpeg($im, ”, 85);
Ipotizziamo di scrivere questo codice nel file captcha.php, e di richiamarlo all’interno del nostro form in un tag img. L’output del file è un’immagine con del testo casuale scritto sopra. Oltre questo, lo script si preoccupa di creare una nuova variabile di sessione identica alla stringa random estrapolata.
Note importanti
Per creare correttamente la variabile di sessione relativa al captcha, dobbiamo aver istanziato la sessione client un session_start(); al top del codice, prima di qualsiasi input html.
Se inseriamo questo codice all’interno di un file specifico (potremmo preferire di scrivere una funzione o addirittura di istanziarlo tramite una classe) per creare l’immagine basterà richiamare il file captcha.php come attributo src dell’immagine, in questo modo:
<img src="captcha.php" alt="myrandomImage" />
Il controllo del captcha deve avvenire da parte dello script che riceverà i dati (via GET o POST). Si dovrà semplicemente verificare che la variabile di sessione creata sia uguale all’input dato dall’utente nella casella in cui si richiede di riscrivere il testo dell’immagine.
Lavorate di fantasia
I bot son furbi, ed un captcha come descritto sopra potrebbe non essere sufficiente. Ribadisco che uno strumento di sicurezza è tanto più efficacie, quanti pochi sono i siti web che lo implementano. Proprio come diceva il buon Luca al TrinacriaCamp, è necessario lavorare di fantasia. Si potrebbe così pensare di creare due stringhe casuali, una da usare come captcha e l’altra da inserire come attributo alt dell’immagine. Magari il bot legge quello e lo proverà, ovviamente in vano. Altro metodo potrebbe essere quello di scrivere un’operazione, generando due numeri casuali, sommandoli pre creare la variabile di sessione, ma scrivendo sull’immagine 5 + 7. Sono solo esempi ovviamente. L’importante è fantasticarci un po’ 🙂
Nascondiamoci il più possibile
Altra precauzione, mai risolutiva, ma che ci espone di meno, è quella di nascondere ai bot così chiaramente che quella immagine è generala via script. Un attributo src con argomento captcha.php è fin troppo facile da inquadrare. In questo caso, per gli utenti Apache con mod_rewrite attivo, ci viene in aiuto il mirabolante .htaccess.
RewriteRule nomestruso.jpg captcha.php [L]
Ed un conseguente.
<img src="nomeastruso.jpg" alt="mioalt" />
Ricordate sempre che quando si parla di sicurezza, spesso un metodo fatto in casa con la giusta riservatezza può risultare molto più sicuro di una fantasmagoria classe pubblica che tutti, programmatori di bot compresi, conoscono. E poi quanto è più divertente farleso da se? Da quando ho il carciofo ho smesso di cancellare circa 150 commenti spam al giorno. Sarà il captcha più stupido del mondo, ma funziona 🙂