In recatpcha v3 l'utente non è più chiamato a digitare codici di verifica o indovinare numeri civici da foto di abitazioni; un complesso algoritmo verifica che il comportamento tenuto dall'utente sia "umano" (modalità di compilazione dei campi, movimento del mouse nella pagina) e validare di conseguenza il modulo. Ecco come installarlo in pochi e semplici passaggi.

Per installare il recaptcha (chiamato "grecaptcha") dobbiamo innanzitutto generare una coppia di chiavi, una pubblica ed una privata, dall'apposito sito . Andrà generata una coppia di chiavi per ciascun sito su cui vorremo utilizzare il tool. Dopodichè dobbiamo installare 3 snippet di codice: un javascript nella sezione head del form da proteggere, un campo aggiuntivo html nello stesso form e uno script di validazione php nella pagina di risposta.
Iniziamo incollando appunto nell'head della pagina contenente il form da proteggere questo snippet:
<script src="https://www.google.com/recaptcha/api.js?render=inserire qui la chiave pubblica"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('inserire qui la chiave pubblica', {action: 'homepage'}).then(function(token) {
document.getElementById('g-recaptcha-response').value = token;
});
});
</script>
e aggiungere nel codice html del form questo campo
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">
Fin qui tutto molto semplice, aprendo la pagina ora dovremmo visualizzare in basso a destra un logo del google recaptcha.
La validazione va integrata ovviamente nella pagina che gestisce la risposta php del form (quindi quella che elabora la registrazione dell'utente o che invia un messaggio).
Per prima cosa aggiungiamo una funzione che ci restituisca l'ip dell'utente:
function get_client_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
$ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
$ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
$ipaddress = getenv('REMOTE_ADDR');
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
quindi aggiungiamo la chiamata al server di google a cui passiamo il campo POST creato poco fa:
$fields = http_build_query(array('secret'=>'inserire qui la chiave privata','response'=>$_POST['g-recaptcha-response'], 'remoteip'=>get_client_ip())); // encode array to POST string
$post = curl_init();
curl_setopt($post, CURLOPT_URL, 'https://www.google.com/recaptcha/api/siteverify');
curl_setopt($post, CURLOPT_POST, 1);
curl_setopt($post, CURLOPT_POSTFIELDS, $fields);
curl_setopt($post, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($post, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($post, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($post);
$result = json_decode($result);
if($result->success != 1){
die('A causa di problemi tecnici non è possibile proseguire. Cortesemente, ricompilare il modulo tra pochi minuti. Grazie per la collaborazione.');
}
Tutto qui! Per verificare il comportamento in caso di risposta negativa, è sufficiente reinviare il form (tasto F5), comportamento che solleva l'eccezione da parte del validatore di Google (invio multiplo dello stesso form).