Ti trovi su Risorse Webmaster > PHP: Captcha in PHP: Filtrare lo spam nei moduli e form. Ecco come realizzarlo
PHP: Captcha in PHP: Filtrare lo spam nei moduli e form. Ecco come realizzarlo
- articolo pubblicato su Yappy.it -
Il codice che vedremo permette di creare una sorta di password a guardia dei form per l'invio di messaggi o di login degli utenti.
L'obiettivo è che spider o sistemi automatici siano impossibilitati ad utilizzare un sito per i loro scopi mentre l'utente può accedere al sito o utilizzare il form solo leggendo il codice inserito nell'immagine e dopo averlo inserito nella casella.
Vediamo come procedere:
- creare un codice che l'utente deve digitare in una casella;
- creare un'immagine con quel codice inserito all'interno;
- controllare se il codice digitato è uguale a quello inserito nell'immagine;
Il trucco sta proprio nel fatto che un programma automatico non è in grado di riconoscere le forme in un'immagine come quella mostrata di seguito.
Creiamo il file modulo.php
<form method="post" action="login.php">
<input type="text" name="utente" value="utente" size="12" onfocus="this.value=''"> utente<br>
<input type="password" name="password" value="password" size="12" onfocus="this.value=''"> password<br>
<img src="genera_codice.php" width="100" height="30">
<input type="codice" name="codice" value="" size="12" onfocus="this.value=''"> codice<br>
<input type="submit" name="login" value="login" class="bottone">
</form>
Ora vediamo il codice genera_codice.php che permette di creare l'immagine on the fly (per chi non conosce bene l'inglese è proprio il nostro creare un'immagine al volo)
$numero = 6;
// numero caratteri da usare per il codice
$data = date("Y-m-d H:i:s");
$codice = substr(md5($data),10,$numero);
// ho generato un codice casuale legato all'orario
$_SESSION['codice'] = $codice;
// lo memorizzo per poterlo poi controllare
// controllo se la libreria è attiva
if (!function_exists('gd_info')) print "Occorre attivare la libreria grafica";
else {
header("Content-type: image/png");
$percorso = "tuo_percorso_immagine_base";
$image = ImageCreatefromJPEG($percorso);
$green = imagecolorallocate($image,51,104,51);
ImageString($image, 5, 35, 12, $codice, $green);
Imagepng($image);
ImageDestroy($image);
}
?>< p="" />
Da notare come i due elementi:
- header("Content-type: image/png");
- Imagepng($image);
permettono al file genera_codice.php di essere interpretato del browser come un'immagine.
Attenzione: perchè il codice funzioni occorre che sia attiva la libreria grafica.
Per attivarla è necessario aprire il file php.ini e togliere il punto e virgola davanti alla riga: extension=php_gd2.dll
Salvare quindi il file php.ini così modificato e ri-avviare il webserver Apache.
Abbiamo inoltre evitato altre librerie per la gestione dei testi come quella che usa i postscript o quella che usa i true type font.
Se cercate informazioni a riguardo le potete trovare sul sito www.php.net
La parte successiva del codice riguarda il controllo all'interno del file login.php:
<?
// se il valore nella sessione non è uguale al valore digitato
// l'utente è re-inviato al modulo per un nuovo inserimento
if ($_SESSION['codice']!=$_REQUEST['codice']) {
header("location: modulo.php");
exit:
}
// qui di seguito metti il tuo codice per il controllo dei dati inseriti dall'utente
// ...
?>


