Quante volte nel nostro sito vediamo utenti falsi, o nei log dei servizi vediamo tante righe con pubblicità e quant'altro...beh vediamo come riuscire ad arginare semplicemente il problema inserendo un semplice captcha. Il captcha non è altro un sistema che verifica che il form sia stato effettivamente compilato da una persona e non da un software automatico. Il modo più semplice e anche il più diffuso è inserire una textbox nel form e un'immagine affianco a questo con una codice in essa. L'utente dovrà compilare il form e inserire nella texbox il codice rappresentato nella figura. Ovviamente solo le persone possono leggere nelle immagini e i bot vengono così esclusi (in realtà esistono anche sistemi molto avanzati che riescono tramite algoritmi di riconoscimento dei margini a individuare il codice...ma non funzionano al 100% su tutti i captcha).
Vediamo quindi come creare il tutto. Faremo uno script che si occuperà di creare un'immagine dinamica con il codice all'interno (tramite l'uso delle librerie GD). Il codice verrà inserito nel db e avrà una durata associata, per esempio qualche minuto..ogni qualvolta l'utente compila il form e inserisce il codice captcha, lo script dovrà controllare se il codice esiste e se esiste cancellarlo dal db!
SCRIPT CAPTCHAVediamo allora innanzitutto come creare il db:
CREATE TABLE `cpt_captcha` (
`id` int(11) NOT NULL auto_increment,
`code` text NOT NULL,
`expirydate` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Creiamo il file con le configurazioni con i dati del nostro db:
<?php
// DATI SERVER MYSQL
$db_host="localhost";
$db_user="root";
$db_pass="";
$db_name="captcha";
$db_prefix = "cpt_";
?>
Infine inseriamo nello script che riceve i dati del form, tra cui il codice, un require per includere il file verify_captcha.php e un richiamo alla funzione verify_captcha($codice):
function verify_captcha($codice) {
if( empty($codice) ) return "Inserire il Codice Captcha!";
$code = addslashes( htmlspecialchars($codice) );
@mysql_query("DELETE FROM ".$db_prefix."captcha WHERE expirydate <".time(),$connessione);
$cap = mysql_query("SELECT * FROM ".$db_prefix."captcha WHERE code LIKE '".$code."'",$connessione);
if(mysql_num_rows($cap) == 0) return "Codice Captcha errato!";
else return NULL;
}
if(isset($_POST['invia'] ) {
if( isset($_POST['codice']) ) $ret=verify_captcha($_POST['codice']);
else die("Codice captcha mancante");
if($ret != NULL) die($ret);
...
...
}