Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Php : Installare il recaptcha di google

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.

Php

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).