8768 sujets

Développement web côté serveur, CMS

Hello !

J'ai un script PHP qui permet de déterminer si un utilisateur est un robot ou non en vérifiant un token
$captcha_reponse;
à l'aide de Google reCAPTCHA v3.

Ce script fonctionne très bien, je l'utilise depuis déjà quelques mois.

Aujourd'hui j'aimerais l'utiliser par l'intermédiaire d'une fonction.

Ma fonction ne fonctionne pas; elle retourne systématiquement "false" résultat de la condition :
if(empty($response) || is_null($response)) { return false; }


Je l'impression que le problème viendrait de la portée d'une fonction/variable.

Voici la fonction :


function Captcha($captcha_reponse) {
    global $captcha_secret;
    if(empty($captcha_reponse)) {
        return false;
    } else {
        $url = "https://www.google.com/recaptcha/api/siteverify?secret={$captcha_secret}&response={$captcha_reponse}";
        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);
            $response = curl_exec($curl);
        } else {
            $response = file_get_contents($url);
        }
            if(empty($response) || is_null($response)) {
            return false;
        } else {
            $data = json_decode($response);
            $score_captcha = $data->score;
            if($data->success) {
                return true;
            }
        }
    }
}


Voilà Smiley cligne
Maël
Modifié par maelstaudt (23 Sep 2021 - 11:50)
Hello,

À première vue j'aurais tendance à dire que $response n'est ni vide, ni null, c'est pourquoi ta condition retourne systématiquement false.

Du coup, que contient $response à cette étape du script ? Un petit var_dump($response) à ce moment pourrait sans doute aider Smiley smile
Loraga a écrit :
Hello,

À première vue j'aurais tendance à dire que $response n'est ni vide, ni null, c'est pourquoi ta condition retourne systématiquement false.

Du coup, que contient $response à cette étape du script ? Un petit var_dump($response) à ce moment pourrait sans doute aider Smiley smile


Merci pour cette réponse rapide !

j'ai bien un retour avec "var_dump($response);"

En cas de succès (token Google valide) :
1


En cas d'échec (token Google invalide ou déjà utilisé) :

/home/ifvm6740/dev/dev2/index.php:27:
object(stdClass)[1]
  public 'success' => boolean false
  public 'error-codes' => 
    array (size=1)
      0 => string 'timeout-or-duplicate' (length=20)
Modérateur
je vais ptetre dire une connerie mais pourquoi ne pas faire l'inverse du coup ?

       if($response == 1) {
            $data = json_decode($response);
            $score_captcha = $data->score;
            if($data->success) {
                return true;
            }
        } else {
            return false;
        } 


( ===1 ou ==='1' ou == 1 ou == true je sais pas exactement ce qui est retournée mais l'idée est là Smiley lol )
Modifié par _laurent (23 Sep 2021 - 13:24)
Bon, problème résolu !

Mon fonction fonctionne parfaitement depuis le début..

C'est dans le traitement de mon formulaire que j'ai inversé "true" et "false"..

En effet j'ai une condition qui die(); le script si Captcha(); === false, or moi j'avais mis true..

Merci à vous.

Maël