Recaptcha V3

Eléphanteau du PHP | 37 Messages

10 mars 2021, 16:43

Bonjour à tous, j’ai une question qui peut paraître bête mais bon..

J’ai un site one page qui comporte un article de formulaire de contact avec recaptcha V3 et un article pour laisser un commentaire sans protections,

Est-ce que le recaptcha V3 protège tout mon site ou seulement le formulaire de contact ? Car forcément j’ai la pastille sur tout le site.
J’ai du mal à comprendre le fonctionnement du recaptcha V3

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

10 mars 2021, 17:58

Recaptcha ne fonctionne que sur les formulaires que tu protèges avec, cf la doc pour l'intégration :
https://developers.google.com/recaptcha/docs/v3
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 37 Messages

10 mars 2021, 19:44

Merci pour ta réponse, dommage que la doc ne soit pas en français.
Je sens que ça va être fastidieux cette histoire.. Vous risquez de me revoir vu mon faible niveau.. :|

Eléphanteau du PHP | 37 Messages

10 mars 2021, 20:13

J'essaie de comprendre la doc mais je ne suis pas très doué en anglais. Je ne vois rien pour rentrer la clé secrète ?

Est-ce que

Code : Tout sélectionner

data-action='submit'
doit remplacer mon

Code : Tout sélectionner

type="submit"
?

Voici ce que j'ai fait :

Code : Tout sélectionner

<button class="primary g-recaptcha" data-sitekey="reCAPTCHA_maclésite" data-callback='onSubmit' data-action='submit' type="submit">Envoyer</button>

Code : Tout sélectionner

<!-- Début Rcaptcha V3 Commentaires --> <script> function onSubmit(token) { document.getElementById("demo-form").submit(); } </script> <script> function onClick(e) { e.preventDefault(); grecaptcha.ready(function() { grecaptcha.execute('reCAPTCHA_maclésite', {action: 'submit'}).then(function(token) { // Add your logic to submit to your backend server here. }); }); } </script> <!-- Fin Rcaptcha V3 Commentaires -->

Code : Tout sélectionner

<!-- Recaptcha V3 commentaire Début --> <script src="https://www.google.com/recaptcha/api.js"></script> <script src="https://www.google.com/recaptcha/api.js?render=reCAPTCHA_maclésite"></script> <!-- Recaptcha V3 commentaire Fin -->

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

11 mars 2021, 14:30

Je n'ai pas le temps malheureusement de débuguer dans le détail ton code dans l'immédiat, mais si tu veux avancer en parallèle, un guide en français est dispo ici :
https://www.prositeweb.ca/comment-prote ... ha-v3-php/
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 37 Messages

12 mars 2021, 13:43

Merci pour le tutoriel en FR mais entre temps j'en ai suivi un autre.

Je n'étais pas sur de ce que j'avais fait avec le tutoriel que j'ai trouvé mais la pastille recaptcha apparait bien sur mon site (j'avais supprimé le recaptcha du formulaire de contact pour pouvoir voir la 2e)
Ce n'est pas moi qui avait fait le recaptcha du formulaire de contact.

J'ai l'impression d'avoir fait quelque chose d'aléatoire sur mon code, j'ai bien la pastille mais comment être sur que ça fonctionne ? car quand je supprime un bout de mon code j'ai quand meme la pastille..


Je mets quand même mon code même si tu n'as pas le temps de le regarder pour le moment :

Code : Tout sélectionner

<!-- Début Commentaires --> <form action="add_comment.php" id="comment_form" method="POST"> <div class="fields"> <div class="field half"> <label for="name">Pseudo</label> <input type="text" name="comment_name" id="comment_name" required /> </div> <div class="field half"> <label for="email">Email</label> <input type="email" name="email" id="email" required /> </div> <div class="field"> <label for="message">Message</label> <textarea name="comment_content" id="comment_content" rows="4" required ></textarea> <span id="comment_message"></span> <!--Ton message a bien été envoyé--> <!--Une «alerte» div cachée ci-dessous pour afficher le message reçu du serveur une fois le formulaire soumis--> <div id="alert2"></div> <!--recaptcha cachée ci-dessous--> <input type="hidden" class="grecaptcha-badge" id="recaptchaResponse-com" name="recaptcha-response" /> <input type="hidden" name="comment_id" id="comment_id" value="0" /> <!--Fin alerte--> </div> </div> <ul class="actions"> <li> <button class="primary" type="submit">Envoyer</button> </li> <li> <input type="reset" value="Effacer" /> </li> </ul> </form> <!--recaptcha--> <script src="https://www.google.com/recaptcha/api.js?render=***"></script> <script> grecaptcha.ready(function () { grecaptcha .execute("***", { action: "homepage", }) .then(function (token) { document.getElementById( "recaptchaResponse-com" ).value = token; }); }); </script>

Code : Tout sélectionner

<?php //add_comment.php $connect = new PDO('***'); $error = ''; $comment_name = ''; $comment_content = ''; $email = ''; // Début recaptcha // On vérifie si le champ "recaptcha-response" contient une valeur if(empty($_POST['recaptcha-response'])){ header('Location: index.html'); }else{ // On prépare l'URL $url = "https://www.google.com/recaptcha/api/siteverify?secret=***&response={$_POST['recaptcha-response']}"; // On vérifie si curl est installé 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{ // On utilisera file_get_contents $response = file_get_contents($url); } // On vérifie qu'on a une réponse if(empty($response) || is_null($response)){ header('Location: index.html'); }else{ $data = json_decode($response); if($data->success){ // Google a répondu avec un succès // On traite le formulaire }else{ header('Location: index.html'); } } // Fin recaptcha if(empty($_POST["comment_name"])) { $error .= '<p class="text-danger"></p>'; } else { $comment_name = $_POST["comment_name"]; } if(empty($_POST["comment_content"])) { $error .= '<p class="text-danger"></p>'; } else { $comment_content = $_POST["comment_content"]; } if(empty($_POST["email"])) { $error .= '<p class="text-danger"></p>'; } else { $email = $_POST["email"]; } if($error == '') { $query = " INSERT INTO tbl_comment (parent_comment_id, comment, comment_sender_name, email) VALUES (:parent_comment_id, :comment, :comment_sender_name, :email) "; $statement = $connect->prepare($query); $statement->execute( array( ':parent_comment_id' => $_POST["comment_id"], ':comment' => $comment_content, ':comment_sender_name' => $comment_name, ':email' => $_POST["email"] ) ); $error = '<label class="validation">Ton message a bien été envoyé !</label>'; } else{ header('Location: index.html');// Fin recaptcha-2 } } $data = array( 'error' => $error ); echo json_encode($data); ?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

12 mars 2021, 15:18

Il faut que tu vérifies que tu as bien $data->success dans la réponse de Google en PHP.

Par ailleurs pour éviter les problèmes, mon conseil c'est qu'à chaque fois, sans exception, que tu as un header('Location: ...'); tu ajoutes immédiatement après un die(); ou un exit;
Pour être sûr que la redirection se fasse et ainsi éviter que du code soit encore exécuté après et que tu aies un comportement non souhaité.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 37 Messages

12 mars 2021, 16:45

Au risque de passer pour un gros amateur (ce que je suis...) Pourrais-tu me donner la marche à suivre pour vérifier que j'ai bien $data->success dans la réponse de Google stp ?

Et j'ai suivi ton conseil en ajoutant à chaque header('Location: ...') l'emploi de la fonction die();

Code : Tout sélectionner

header('Location: index.html'); die(); }else{

Eléphanteau du PHP | 37 Messages

16 mars 2021, 13:23

Up svp

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

16 mars 2021, 19:42

C'est à l'intérieur de ton if que tu dois traiter ton formulaire :
if($data->success) {
     // Google a répondu avec un succès
     // On traite le formulaire
}
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 37 Messages

17 mars 2021, 12:54

Merci pour ta réponse.

De cette manière est-ce juste ?

Code : Tout sélectionner

<?php //add_comment.php $connect = new PDO('***'); $error = ''; $comment_name = ''; $comment_content = ''; $email = ''; // Début recaptcha // On vérifie si le champ "recaptcha-response" contient une valeur if(empty($_POST['recaptcha-response'])){ header('Location: index.html'); die(); }else{ // On prépare l'URL $url = "https://www.google.com/recaptcha/api/siteverify?secret=***&response={$_POST['recaptcha-response']}"; // On vérifie si curl est installé 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{ // On utilisera file_get_contents $response = file_get_contents($url); } // On vérifie qu'on a une réponse if(empty($response) || is_null($response)){ header('Location: index.html'); die(); }else{ $data = json_decode($response); if($data->success){ // Google a répondu avec un succès // On traite le formulaire if(empty($_POST["comment_name"])) { $error .= '<p class="text-danger"></p>'; } else { $comment_name = $_POST["comment_name"]; } if(empty($_POST["comment_content"])) { $error .= '<p class="text-danger"></p>'; } else { $comment_content = $_POST["comment_content"]; } if(empty($_POST["email"])) { $error .= '<p class="text-danger"></p>'; } else { $email = $_POST["email"]; } if($error == '') { $query = " INSERT INTO tbl_comment (parent_comment_id, comment, comment_sender_name, email) VALUES (:parent_comment_id, :comment, :comment_sender_name, :email) "; $statement = $connect->prepare($query); $statement->execute( array( ':parent_comment_id' => $_POST["comment_id"], ':comment' => $comment_content, ':comment_sender_name' => $comment_name, ':email' => $_POST["email"] ) ); $error = '<label class="validation">Ton message a bien été envoyé !</label>'; } else{ header('Location: index.html');// Fin recaptcha-2 die(); } }else{ header('Location: index.html'); die(); } } // Fin recaptcha $data = array( 'error' => $error ); echo json_encode($data); } ?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 mars 2021, 17:51

On dirait oui, mais à toi de tester pour voir si ça fait bien ce que tu veux :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 37 Messages

17 mars 2021, 18:32

Bé c'est bien mon problème, je ne sais pas comment savoir si le recaptcha fonctionne

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

19 mars 2021, 11:31

Bah si Google te réponds que l'utilisateur courant n'est pas un bot, ça suffit, qu'est-ce que tu veux vérifier d'autres ? :-D
Et en mettant ton traitement dans :
if($data->success){
  // Google a répondu avec un succès
  // Ton traitement...
C'est exactement ce que tu fais !
Quand tout le reste a échoué, lisez le mode d'emploi...