Verifica antispam CAPTCHA con PHP, tutorial
In questo tutorial parliamo del CAPTCHA ed illustreremo come implementarlo in pochi passaggi con PHP.
Il CAPTCHA è ad oggi il metodo più utilizzato nei form per distinguere umani da bot e si tratta di un’immagine con testo generato dinamicamente su sfondo distorto o comunque di difficile lettura che quindi non può essere decifrato facilmente da un algoritmo.
Vediamo come realizzarlo in pochi minuti.
Innanzitutto aprite un editor grafico e disegnate lo sfondo caotico su cui verrà applicato il testo da leggere scegliendo bene i colori ed evitando troppi contrasti.
Fatto questo, passiamo al codice PHP.
session_start();
header("Content-type: image/png");
$captchaImage = imagecreatefrompng("captcha.png") or die("Cannot Initialize new GD image stream");
$captchaFont = imageloadfont("font.gdf");
$captchaText = substr(md5(uniqid(”)),-9,9);
Apriamo una sessione e come prima cosa settiamo come header della pagina il tipo di file image/png (essendo in questo caso l’immagine di tipo PNG), così che l’output della pagina venga considerato come file grafico (nel form comparirà proprio il risultato di questa pagina), quindi creiamo un oggetto immagine tramite la funzione imagecreatefrompng.
Se l’oggetto immagine viene creato correttamente, creiamo un oggetto per il font caricato: il font deve essere di formato GD altrimenti non viene generato dalla macchina su cui gira PHP.
Trovate una raccolta di GDF a questa pagina ma se avete esigenze particolari potete crearvene uno dal vostro TTF preferito con questo programma per Windows, scaricabile qui.
L’operazione successiva consiste nel creare dinamicamente il testo che l’utente umano dovrà inserire per la verifica: con uniqid creiamo un id dell’utente calcolato secondo il tempo in quel preciso istante, ne calcoliamo l’hash MD5 e poi con substring associamo alla variabile $captchaText una porzione della stringa composta dagli ultimi nove caratteri.
$captchaColor = imagecolorallocate($captchaImage,200,200,200);
imagestring($captchaImage,$captchaFont,15,5,$captchaText,$captchaColor);
imagepng($captchaImage);
imagedestroy($captchaImage);
?>
Settiamo una variabile di sessione dove conserviamo il testo da inserire e poi creiamo l’oggetto $captchaColor che contiene le informazioni sul colore del testo (R,G e B, con valori da 0 a 255), sceglietelo visibile ma non troppo contrastante con lo sfondo.
Con la funzione imagestring disegniamo il testo sul PNG passando come parametri l’oggetto immagine, il font, le coordinate X e Y, il testo e il suo colore.
Ora, con imagepng, diamo l’output dell’immagine definitiva: volendo potete usare anche imagegif, imagejpeg etc, se volete cambiare formato all’immagine.
Come ultima cosa liberiamo la memoria del server distruggendo l’oggetto dell’immagine che non serve più.
Il codice CAPTCHA.PHP per intero:
session_start();
header("Content-type: image/png");
$captchaImage = imagecreatefrompng("captcha.png") or die("Cannot Initialize new GD image stream");
$captchaFont = imageloadfont("font.gdf");
$captchaText = substr(md5(uniqid(”)),-9,9);
$_SESSION[’session_captchaText’] = $captchaText;
$captchaColor = imagecolorallocate($captchaImage,200,200,200);
imagestring($captchaImage,$captchaFont,15,5,$captchaText,$captchaColor);
imagepng($captchaImage);
imagedestroy($captchaImage);
?>
Nella pagina che conterrà il form dovremo eseguire semplici operazioni, subito prima del codice HTML:
session_start();
if($_POST)
{
if($_POST[’txt_captcha’]!="")
{
//echo($_POST[’txt_captcha’]."<br />");
//echo($_SESSION[’session_captchaText’]);
if($_POST[’txt_captcha’]==$_SESSION[’session_captchaText’])
{
echo("Sei umano");
}
else
{
echo("Sei un bot");
}
}
}
?>
Apriamo la sessione, verifichiamo di essere in fase di POST, che la variabile passata per POST del campo di testo con nome txt_captcha contenga del testo e per finire che questo testo sia lo stesso della variabile di sessione session_captchaText del codice di CAPTCHA, in caso contrario l’utente è un bot e i dati del form non verranno inviati.
Nella pagina inseriamo la stringa:
Il risultato di questa pagina è infatti l’immagine creata dal codice.
Cerca: antispam captcha, captcha, captcha PHP, php script, tutorialRitieni questo post utile o interessante?
Condividi e Segnala
Leggi anche:




