Problème reCAPTCHA PHP

Fermé
llaumegui - 11 oct. 2022 à 15:08
 llaumegui - 12 oct. 2022 à 08:36

Bonjour, j'ai souhaite mettre en place une protection anti-brute force pour ma page de connexion avec un reCAPTCHA.

J'ai trouvé un tuto sur internet avec quelque chose qui à l'air de marcher mais il y a un truc qui m'échappe notamment dans la partie retour d'une API (je ne travail pas souvent avec des API).

Les bouts de mon code :

Mon formulaire :

<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<div class="container col-xl-10 col-xxl-8 px-4 py-0">
  <div class="row align-items-center g-lg-5 py-5">
    <div class="col-lg-7 text-center text-lg-start">
      <h1 class="display-4 fw-bold lh-1 mb-3">PORTAIL</h1>
      <p class="col-lg-10 fs-4">Bienvenue sur le portail. N'hésitez pas à nous faire un retour si vous avez rencontré des problèmes lors de la navigation.<br> Bonne journée à vous.<br> Cordialement. </br>
     
    </div>
    <div class="col-md-10 mx-auto col-lg-5">

      <form class="p-4 p-md-5 border rounded-3 bg-light" method="POST" action="<?= URL ?>validation_login">
        <div class="form-floating mb-3">
          <input type="text" class="form-control" id="login" placeholder="AAAA0000" name="login" required>
          <label for="login">CUID</label>
        </div>
        <div class="form-floating mb-3">
          <input type="password" class="form-control" id="password" name="password" placeholder="Mot de passe" required>
          <label for="password">Mot de passe</label>
        </div>
        <button class="w-100 btn btn-lg btn-primary bouton border-0" id="vdcsolo" type="submit">Connexion</button>
        <hr class="my-4">
        <a href="<?= URL ?>users/motdepasse"><small class="text-muted">Pour un mot de passe oublié, cliquez ici.</small></a>
        <div class="g-recaptcha" data-sitekey="ma_clé_site"></div><br><br>
      </form>



    </div>
  </div>
</div>

Ma fonction pour se connecter :

public function isCombinaisonValide($login, $password)
    {
        if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])){

                $secret = 'ma_clé_secrète';
                $verifyResponse = @file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
                $responseData = json_decode($verifyResponse);

                if($responseData->success)
                { 
                    $passwordBD = $this->getPasswordUser($login);

                    if (password_verify($password, $passwordBD)) {
                        return true;
                    } else {
                        Toolbox::ajouterMessageAlerte("Echec de la comparaison - Code erreur: #UM04", Toolbox::COULEUR_ROUGE);
                        return false;
                    }
                }
                else
                {
                    var_dump($_POST['g-recaptcha-response']);
                    ?>   <div style="color: red;"><b>Robot verification failed, please try again.</b></div> <?php
                }
        }
        else{
                ?>   <div style="color: red;"><b>Please do the robot verification.</b></div>    <?php
            }
        
    }

Mon erreur avec mes 2 var_dump() le $_POST['g-recaptcha-response'] et l'autre tout en bas c'est mon mdp que je rentre  :

Et quand je rentre le liens dans la barre d'url :

https://www.google.com/recaptcha/api/siteverify?secret=macl&eacute%3BSecr=&egrave%3Bte=&response=laValeurDeMonVarDump

ça me retourne bien :

Donc le seul problème je pense que comme le dit l'erreur c'est au niveau de mon if:

if($responseData->success)

Je ne sais pas comment savoir que mon appel à l'API retourne bien :

"success": true

J'pense que ça doit pas être compliqué mais comme je vous dit je travail très rarement avec des API donc si vous pouvez m'aider je suis preneur !

Cdt

1 réponse

jordane45 Messages postés 38045 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 février 2024 4 619
11 oct. 2022 à 15:43

Bonjour,

Il faut faire un json_decode


0

Bonjour, je fais déjà un json_decode à ce niveau là juste au dessus de mon if :

$responseData = json_decode($verifyResponse);
0
jordane45 Messages postés 38045 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 février 2024 4 619 > llaumegui
11 oct. 2022 à 16:11

Fais un var_dump  de verifyResponse puis de responseData

0
llaumegui > jordane45 Messages postés 38045 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 février 2024
11 oct. 2022 à 16:25

J'ai fais les deux var_dump() au même niveau que mon var_dump précédent : 

le var_dump($verifyResponse) -> bool(false)

le var_dump(responseData) -> NULL

0
jordane45 Messages postés 38045 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 février 2024 4 619 > llaumegui
11 oct. 2022 à 16:51

C'est donc qu'il n'arrive pas à lire le contenu de l'url  dans l'instruction

 $verifyResponse = @file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
             
0
llaumegui > jordane45 Messages postés 38045 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 février 2024
Modifié le 12 oct. 2022 à 08:36

D'accord et pourquoi il n'arrive pas à le lire et comment remédier à ça ? 

Pour info au départ j'avais file_get_contents(...) au lieu de @file_get_contents(...) et j'avais cette erreur : 

0