Salve a tutti,
oggi mostreremo una tecnica di sicurezza base per creare un proprio strumento captcha per controllare se l’utente che sta inserendo i dati è un umano oppure un bot. Tipico test CAPTCHA è quello in cui si richiede di scrivere quali siano le lettere o numeri presenti in un’immagine pre-costruita.
Tale meccanismo è utilizzato per lo più per proteggere il sito da attacchi di forza bruta e per evitare che programmi bot spammino troppi messaggi automatici.

Obiettivo: realizzare un semplice form con un test captcha per aumentare la sicurezza del sito ed individuare eventuali bot.

Il progetto si comporrà sostanzialmente di due file: nel primo , creeremo l’immagine captcha utilizzando le funzioni base php per gestire le immagini ( captcha.php), la seconda conterrà il form con dentro l’immagine captcha e farà il controllo che il codice immesso sia corretto (form.php).


Il Captcha
Ci sono svariati criteri per creare una immagine di test sicura; noi mostremo un metodo semplice per creare una piuttosto randomica; nel nostro esempio tale immagine conterrà infatti una semplice stringa alfanumerica casuale: a sua volta tale stringa sarà “colorata” con due colori RGB diversi e noi chiederemo che venga inserito solo una sequenza  di un data colore. Per ulteriore scrupolo anche la dimensione della sequenza giusta ha una lunghezza che spazia in un dato range.
Iniziamo a vedere il codice:

 

<?php
session_start();
$my_img = imagecreate( 150, 40 );
$background = imagecolorallocate( $my_img, 255, 255, 255 );
$text_colour_correct = imagecolorallocate( $my_img, 0,255, 0 );
$text_colour_wrong = imagecolorallocate( $my_img, 255,0,0 );

?>

Prima di tutto abilitiamo le sessioni in php  visto che dovremmo salvare da qualche parte il codice captcha da controllare.

imagecreate ci permette di creare ed inizializzare le dimensioni della nostra immagine di controllo ( per il momento un 150×40 basterà).Le tre variabili successive saranno i tre diversi tipi di colori che useremo nella nostra applicazione:

1- il colore di sfondo (bianco)

2- il colore del testo corretto che si dovrà inserire ( scegliamo un verde)

3- il colore del testo sbagliato che non dovremo assolutamente inserire ( rosso)


$length_total_string=10;
$length_correct_string=mt_rand(4,8);
$alphas = range(‘A’, ‘Z’);
$numeric=range(0,9);
$alphanumeric=array_merge($alphas,$numeric);
$string_correct=””;
$string_wrong=””;
$colors= array();

for($i=0;$i<$length_total_string;$i++)
{
if($i<=$length_correct_string)
$string_correct.=$alphanumeric[mt_rand(0,35)];
else
$string_wrong.=$alphanumeric[mt_rand(0,35)];
}

 

Questo rappresenta il cuore dello script: definiamo con $length_total_string la lunghezza della stringa totale ,mentre con $length_correct_string scegliamo randomicamente la lunghezza della sequenza corretta , che può spaziare tra 4 e 8 e dovrà ovviamente essere inferiore al valore di  $length_total_string.

Successivamente creiamo l’ array $alphanumeric contenente sia caratteri alfabetici che numeri , in modo tale che le sequenze che verranno generate siano le più variegate possibili . Nel ciclo for infine creiamo le due sequenze alfanumeriche: prima riempiamo la stringa corretta fino alla lunghezza desiderata, poi inseriamo valori in quella sbagliata.

 

if(mt_rand(0,1)==1)
{
imagestring( $my_img,5,3,10,$string_correct,$text_colour_correct );
imagestring( $my_img,5,12+9*$length_correct_string,10, $string_wrong,$text_colour_wrong );
}
else
{
imagestring( $my_img,5,3, 10,$string_wrong,$text_colour_wrong );
imagestring( $my_img,5,9*($length_total_string-$length_correct_string)-6,10,$string_correct,$text_colour_correct );
}
$_SESSION[‘captcha_code’]=$string_correct;
header( “Content-type: image/png” );
imagepng( $my_img );

imagecolordeallocate( $text_colour_correct);
imagecolordeallocate( $text_colour_wrong );
imagecolordeallocate( $background );
imagedestroy( $my_img );

?>

 

imagestring è la funzione adibita a scrivere il testo dentro l’immagine: useremo queste per scrivere sull’imagine sia il testo corretto che  quello erroneo. Per evitare che la posizione delle stringhe non sia sempre uguale, anche l’ordine di scrittura è randomico : in tale modo non si può prevedere quale delle due stringhe ( corretta o falsa ) sarà la prima partendo da sinistra.  Il valore poi da controllare sarà salvato nella variabile di sessione $_SESSION[‘captcha_code’] così da permettere il controllo successivamente.

Le ultime funzioni servono per deallocare le variabili usate e per gestire la pagina php come un ‘immagine di tipo png.Terminato ciò, finalmente possiediamo la nostra immagine captcha che salvaremo nel file catpcha.php.

 

Il Form ed il Controllo

Ultima fase del nostro script sarà quello di creare il form per l’inserimento dei dati e il controllo del codice di sicurezza; apriamo un altro file php ed incolliamo il codice seguente:

<?php
session_start();

if(isset($_SESSION[‘captcha_code’]) && isset($_POST[‘code’]) && $_POST[‘code’]!=”” && isset($_POST[‘user’]) && $_POST[‘user’]!=””)
{

if (strtolower($_SESSION[‘captcha_code’]) == strtolower($_POST[‘code’]))
echo “Benvenuto “.$_POST[‘user’];
else
echo “Benvenuto Bot”;

}
?>

<form method=”post”>
<table>
<tr><td>User</td>
<td><input type=”text” id=”user” name=”user” /></td></tr>
<tr><td> Captcha: Inserire la stringa verde<br> che vedi nell’immagine a fianco</td>
<td><img src=”captcha.php” /><br><input type=”text” id=”code” name=”code” /></td></tr>
<tr><td><input type=”submit” value=”Invia” /></td></tr>
</table>
</form>

 

Notiamo la semplicità del codice: il form è composto da due campi input; nel primo l’utente può inserire una stringa per identificarlo, mentre nella seconda comparirà la nostra immagine di captcha ed un campo da riempire con la stringa verde che comparirà. Per richiamare la nostra immagina captcha è bastato mettere come source il nome stesso del file php  ( tanto abbiamo inserito la funzione che obbliga il server a trattarla come un’immagine png). Cliccando su Invia, verrà creata una richiesta POST indirizzata alla medesima pagina di prova.

Infine, verrà controllato che il valore inserito dall’utente sia lo stesso salvato precedentemente nell’array di Sessione mentre creavamo l’immagine. In caso positivo, ci saluterà con il nome da noi inserito, viceversa il codice di sicurezza ci definirà bot.

Il codice è liberamente scaricabile nel solito repositoy Lab oppure cliccando direttamente sul link sottostante. Se avete dubbi o perplessità, non esitate a chiedere.
Grazie per il tempo concessomi, alla prossima!

Form Login per Joomla

Apl