web-dev-qa-db-fra.com

Comment résoudre le timeout de Google v3 reCaptcha?

Nous avons un formulaire PHP qui est plusieurs onglets et expire sur le reCaptcha. Tout est fait en une seule page et cela fonctionne parfaitement bien SI le formulaire est rempli en <3 minutes.

L'idée d'une solution est de déplacer le traitement du formulaire et reCaptcha vers une page secondaire pour le traitement.

Le problème est que la page de formulaire interroge le service google pour reCaptcha et collecte une valeur de jeton dans un champ masqué.

<input type="hidden" name="recaptcha_response" id="recaptchaResponse">

Le problème est de savoir comment demander ce jeton sur la page de traitement côté serveur? Voici le code utilisé sur la page du formulaire côté client. Je dois en quelque sorte régénérer la valeur du jeton pour l'appliquer en tant que:

$ recaptcha_response

Voici la version de travail sur la page du formulaire. Il est facile de supprimer l'exigence relative à la publication du jeton à partir de la page du formulaire, mais vous ne savez pas comment régénérer le jeton à utiliser sur la page côté serveur.

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['recaptcha_response'])) {

// Build POST request:
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = RECAPTCHA_SECRET_KEY;
$recaptcha_response = $_POST['recaptcha_response'];
$remoteip = $_SERVER['REMOTE_ADDR'];

// Make and decode POST request:
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response. '&remoteip='.$remoteip);
$recaptcha = json_decode($recaptcha);

// Take action based on the score returned:
if ($recaptcha->score >= 0.5) {

MODIFIER POUR AJOUTER: Le fait de faire l'initialisation du reCaptcha jusqu'à ce que Soumettre retarde le problème de synchronisation car cela semble être une option:

https://developers.google.com/recaptcha/docs/v

"2. Appelez grecaptcha.execute sur une action ou au chargement de la page"

4
Burndog

Si vous ne souhaitez pas trop modifier votre code, une approche alternative serait d'envelopper le JavaScript reCaptcha dans une fonction nommée, de définir un intervalle et d'interroger cette fonction, invitant reCaptcha à ajouter un nouveau jeton à votre élément de formulaire toutes les trois minutes:

function getReCaptcha(){
    grecaptcha.ready(function() {
       ...
     });
 }

 getReCaptcha();  // This is the initial call
 setInterval(function(){getReCaptcha();}, 150000);
5
Mike Poole
<script type="text/javascript">
function grecaptcha_execute(){
    grecaptcha.execute('RECAPTCHA_SITE_KEY', {action: 'homepage'}).then(function(token) {
        document.getElementById('recaptchaResponse').value=token;
    });
}
grecaptcha.ready(function() {
    grecaptcha_execute();
});
</script>

<?php
if ($recaptcha->success) {
    echo '<p style="color: #0a860a;">CAPTCHA was completed successfully!</p>';
}else{
    $error_codes = 'error-codes';
    if (isset($Retorno->$error_codes) && in_array("timeout-or-duplicate", $Retorno->$error_codes)) {
        $captcha_msg = "The verification expired due to timeout, please try again.";
    ?>
    <script>grecaptcha_execute();</script>
    <?php
    } else {
        $captcha_msg = "Check to make sure your keys match the registered domain and are in the correct locations.<br> You may also want to doublecheck your code for typos or syntax errors.";
    }
    echo '<p style="color: #f80808;">reCAPTCHA error: ' . $captcha_msg . '</p>';
}
?>
3
PHP Kishan

Il vous suffit d'exécuter la recaptcha lorsque vous soumettez le formulaire.

<script>
function grecaptcha_execute(){
    grecaptcha.execute('RECAPTCHA_SITE_KEY', {action: 'homepage'}).then(function(token) {
        document.getElementById('recaptchaResponse').value=token;
    });
}
</script>

<form onsubmit="grecaptcha_execute()" action="script.php">
...
</form>
0
Mickle Foretic