12-01-2015 16:30:00

Dans ce tutoriel, je vous propose de découvrir comment mettre en place reCAPTCHA pour vos formulaires PHP. reCAPTCHA propose de filtrer le spam en demandant aux utilisateurs d'identifier un texte sur une image.

La première étape est donc de créer et de configurer un captcha pour votre site en vous rendant dans le panneau d'administration : https://www.google.com/recaptcha/admin#list. Il est important de mettre un nom de domaine qui correspond à votre site web. Vous obtiendrez alors 2 informations importantes : La clef de site et la clef secrète.

Mettre en place le formulaire

Pour mettre en place le nouveau reCAPTCHA il faut commencer par importer le javascript dans la partie head de notre site :

<script src='https://www.google.com/recaptcha/api.js'></script>

Ensuite il nous suffit de créer le code HTML qui va contenir notre clef de site

<div class="g-recaptcha" data-sitekey="CLEF SITE"></div>

Cette div sera automatiquement remplacée par le captcha que les utilisateur vont devoir remplir.

Vérifier si le captcha a bien été rempli

Si vous essayez de soumettre le formulaire vous remarquerez une clef g-recaptcha-response, c'est cette clef qui va nous permettre de valider la saisie de l'utilisateur. Pour savoir si cette clef est viable il suffit de demander à l'API : https://www.google.com/recaptcha/api/siteverify en ajoutant les arguments suivant

  • secret, votre clef secrète
  • response, le code de réponse donné par le captcha (g-recaptcha-response)
  • remoteip, l'ip de l'utilisateur (optionnel)

Pour appeller cette api nous allons utiliser curl, et si l'extension n'est pas disponible nous utiliserons un bon vieux file_get_contents()

function isValid($code, $ip = null)
{
    if (empty($code)) {
        return false; // Si aucun code n'est entré, on ne cherche pas plus loin
    }
    $params = [
        'secret'    => CLEF_SECRETE,
        'response'  => $code
    ];
    if( $ip ){
        $params['remoteip'] = $ip;
    }
    $url = "https://www.google.com/recaptcha/api/siteverify?" . http_build_query($params);
    if (function_exists('curl_version')) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // Evite les problèmes, si le ser
        $response = curl_exec($curl);
    } else {
        // Si curl n'est pas dispo, un bon vieux file_get_contents
        $response = file_get_contents($url);
    }

    if (empty($response) || is_null($response)) {
        return false;
    }

    $json = json_decode($response);
    return $json->success;
}

Le code est relativement simple et consiste seulement à appeler l'URL en question avec les paramètres correspondants et de décoder le json que l'on obtient en retour. On cherche ensuite à connaitre la valeur de success qui nous donne true si le captcha et valide et false sinon.