Problème reCAPTCHA PHP
llaumegui -
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é%3BSecr=è%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
Bonjour, je fais déjà un json_decode à ce niveau là juste au dessus de mon if :
Fais un var_dump de verifyResponse puis de responseData
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
C'est donc qu'il n'arrive pas à lire le contenu de l'url dans l'instruction
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 :