scritto da ghiaccio il 07/02/2008
L'immagine contenete un codice di controllo è un metodo usato da molti sistemi nella fase di registrazione al sito internet.
Tutto ciò viene fatto per evitare che avvengano registrazioni automatiche abusive.
L'immagine di controllo fa parte della cosiddetta validazione CAPCTHA ("completely automated public Turing test to tell computers and humans apart") ovvero una metodologia che cerca di determinare se chi sta interagendo con il sistema è un umano o un BOT. Nei sistemi più avanzati vengono combinate due tecniche CAPTCHA, ad esempio oltre all'immagine contenente il codice potrebbe esser presente anche la riproduzione vocale del codice di controllo, per consentire ad un maggior numero di utenti di accedere ai servizi (tipicamente gli utenti non vedenti in questo caso).
Ovviamente esistono molte persone che studiano metodi per superare questi controlli, con script PERL, software OCR per estrapolare testi da immagini, ed altro.
E' per questo che le immagini contenenti il codice di controllo sono deformate o distorte.
Requisiti
Per eseguire questo script è necessario un'interprete PHP con l'estenzione GD2 abilitata ovvero la libreria grafica che fornisce funzioni per la creazione e manipolazione delle immagini.
L'estenzione si abilita semplicemente eliminando il punto e virgola di commento antecedente la dichiarazione
extension=php_gd2.dll
nel file di configurazione php.ini Descrizione metodologia
Il form proposto è un semplice form (X)HTML formattato in una tabella.
Ciò che viene aggiunto è l'immagine CAPTCHA che viene rigenerata automaticamente ad ogni caricamento della pagina.
Questo viene implementato in un modo veramente semplice: ad un tag img viene dato come attributo src uno script PHP.
Al momento del caricamento della pagina, il browser rileverà il tag di tipo immagine ed inviera una richiesta HTTP per l'URL contenuto nell'attributo src, che ritornerà un flusso di dati binari, relativi all'immagine.
Grazie al fatto che si tratta di uno script dinamico, è possibile con questo script inviare ogni volta un diverso output grafico.
L'invio di una intestazione HTTP per esprimere il tipo dei dati che si invia verso il client, viene effettuato con la funzione header("Content-Type: image/png") di PHP.
Nello script l'immagine viene creata con le funzioni GD (oramai praticamente divenute standard) e l'output creato viene inviato al browser sotto forma di immagine PNG (conformemente all'intestazione dichiarata ed inviata) con la funzione imagePNG().
Ci si può forse rendere meglio conto di cosa produce lo script se si apre singolarmente in una pagina.
Lo script verimage.php che genera l'immagine, a sua volta crea una variabile di sessione in cui è contenuto il codice di controllo generato in maniera casuale. Tale codice in questo modo si può semplicemente confrontare al momento della processazione dei dati con quello digitato dall'utente, e se diverso rifiutare la registrazione.
Il codice di verifica è generato con queste istruzioni.
$verify="";
for ($i=0 ; $i < 6 ; $i++) ///genera una stringa alfanumerica casuale
{
if ($i % 2==0) //alla posizione pari
$verify.=mt_rand(0,9); //un numero casuale
else //alla dispari
$verify.=chr(mt_rand(65,90)); //un carattere casuale
}
che semplicemente ad ognuna delle 6 iterazioni genera un carattere.for ($i=0 ; $i < 6 ; $i++) ///genera una stringa alfanumerica casuale
{
if ($i % 2==0) //alla posizione pari
$verify.=mt_rand(0,9); //un numero casuale
else //alla dispari
$verify.=chr(mt_rand(65,90)); //un carattere casuale
}
Alle iterazioni pari ($i pari) il carattere è un numero casuale tra 0 e 9.
Alle iterazioni dispari, si prende un numero casuale tra 65 e 90 che corrisponde al codice di una lettera maiuscola della codifica ASCII, tale numero viene convertito nel carattere ASCII corrispondente tramite la funzione chr() di PHP.
L'altra operazione primaria dello script riguarda la creazione dell'effetto disturbo dell'immagine CAPTCHA.
Il disturbo è causato da semplici righe verticali ed orizzontali parallele di un colore che si avvicina a quello in cui è scritto il codice di controllo.
for ( $i=0 ; $i < $lines ; $i++ ) //disegno le linee sull'immagine
{
if ($i % 2==0) // pari = linee verticali
{
$x1 = $x2 = mt_rand(0,$width); // punto X di partenza e arrivo casuale (linea retta)
$y1=0; $y2=$height; //faccio in modo che percorra tutta l'immagine
}
else // dispari = linee orizzontali
{
$y1 = $y2 = mt_rand(0,$height); // punto Y di partenza e arrivo casuale (linea retta)
$x1 = 0; $x2 = $width; //faccio in modo che percorra tutta l'immagine
}
imageline($im, $x1, $y1, $x2, $y2, $grey); //disegna una linea grigia da (x1,y1) a (x2,y2) sull'immagine
}
Il codice proposto non fa altro che disegnare iterativamente le linee sull'immagine utilizzando imageline().{
if ($i % 2==0) // pari = linee verticali
{
$x1 = $x2 = mt_rand(0,$width); // punto X di partenza e arrivo casuale (linea retta)
$y1=0; $y2=$height; //faccio in modo che percorra tutta l'immagine
}
else // dispari = linee orizzontali
{
$y1 = $y2 = mt_rand(0,$height); // punto Y di partenza e arrivo casuale (linea retta)
$x1 = 0; $x2 = $width; //faccio in modo che percorra tutta l'immagine
}
imageline($im, $x1, $y1, $x2, $y2, $grey); //disegna una linea grigia da (x1,y1) a (x2,y2) sull'immagine
}
Le iterazioni pari generano linee verticali, mentre le dispari generano le orizzontali.
$x1,$y1 e $x2,$y2 rappresentano le coordinate di partenza ed arrivo della linea.
A questo punto si può ben vedere che per le linee verticali, si ha una X di partenza ed arrivo uguale e calcolata casualmente sulla larghezza dell'immagine, mentre le Y di partenza ed arrivo saranno rispettivamente zero e l'intera altezza dell'immagine per far si che la linea la percorra interamente
La stessa cosa simmetrica avviene sulle linee orizzontali.
Non resta che disegnare il codice di verifica sull'immagine alla posizione opportuna (in modo che non strabordi fuori dall'area visibile dell'immagine).
Notare che il disegno del codice sull'immagine viene fatto dopo il disegno delle linee, per evitare che la scritta sia incomprensibile se sovrapposta da troppe linee negli stessi punti.
Scaricate il file zip allegato all'articolo contenente il form dimostrativo, per altri dettagli a sul resto del codice si vedano i commenti all'interno dei file di esempio.
Pubblica il tuo commento per questo articolo
Lista commenti
- Nessun risultato
Scarica esempio dell'articolo

