CAPTCHA
Ma che cosa è un captcha? A cosa serve?
Il CAPTCHA(Completely Automated Public Turing test to tell computers and Humans Apart) è un test fatto di una o più domande 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).
I CAPTCHA sono utilizzati per impedire che i bot utilizzino determinati servizi, come i forum, la registrazione presso siti web, la scrittura di commenti e in generale tutto ciò che potrebbe essere usato per creare spam o per violare la sicurezza con operazioni di hacking come il brute force. Questo tipo di test è stato utilizzato anche per contrastare lo spam generato da bot, obbligando il mittente di un messaggio e-mail non conosciuto dal destinatario a superare un test CAPTCHA prima di consentire la consegna del messaggio.
Un test CAPTCHA tipicamente utilizzato è quello in cui si richiede all'utente di scrivere quali siano le lettere o i numeri presenti in una sequenza, che appare distorta o offuscata sullo schermo.
Implementazione
Questa è la mia classe che sviluppera un'immagine con all'interno il codice del captcha.
CaptchaImage.php
<?php class CaptchaImage{ public $path = "img.jpg"; public $codice; /** * Costruttore della classe * @param string $path Percorso dell'immagine */ public function CaptchaImage($path="img.jpg"){ $this->path = $path; } /** * Crea una immagine con un codice casuale nel percorso $path * @return string Percorso dell'immagine */ public function creaImg(){ // Creo il codice $this->codice = array(rand(0,9), rand(0,9), rand(0,9), rand(0,9)); $len = strlen(implode($this->codice)); // Dimesioni $altezza = 50; $larghezza = 40 * $len; // Creo l'immagine $img = ImageCreate($larghezza,$altezza); // Sfondo $grigio = ImageColorAllocate($img,200,200,200); // Colori $nero = ImageColorAllocate($img,0,0,0); // linee imagesetthickness($img, 3); for($i = 0; $i < rand(4, 10); $i++){ $colore = ImageColorAllocate($img,rand(100,200),rand(100,200),rand(100,200)); ImageLine($img, rand(0,$larghezza),rand(0,$altezza), rand(0,$larghezza),rand(0,$altezza), $colore); } // Scrivo il testo // nella variabile $font bisogna inserire il percorso del font scelto $font = "arial.ttf"; for($i = 0; $i < $len; $i++){ imagettftext($img, 40, rand(-20,20), 30*($i+1), 45, $nero, $font, strval($this->codice[$i])); } // Creo l'immagine nel percorso specificato ImageJPEG($img, $this->path); return $this->path; } /** * Restituisce il codice creato all'interno dell'immagine * @return string Codice di controllo */ public function getCodice(){ return implode($this->codice); } } ?>
Esempio
<?php require("CaptchaImage.php"); $captcha = new CaptchaImage(); ?> <!DOCTYPE html> <html> <head> <title>CAPTCHA</title> </head> <body> <img src="<?php echo $captcha->creaImg();?>" > <p>Codice = <?php echo $captcha->getCodice();?></p> </body> </html>