8

错误消息 我们检测到您的站点未验证 reCAPTCHA 解决方案。这是在您的网站上正确使用 reCAPTCHA 所必需的。请查看我们的开发者网站了解更多信息。 我创建了这个 reCaptcha 代码,它运行良好,但我不知道如何验证它,我认为它正在使用函数进行验证, grecaptcha.getResponse();但事实并非如此。显然,recaptcha 在网站上运行良好,但我刚刚在 Google 管理员中看到了下一条消息: 在此处输入图像描述

要求: 1.不要在表单中使用action="file.php",表单中只有一个javascript函数。

     <!DOCTYPE>
<html>
<head >
    <title></title>
    <script src='https://www.google.com/recaptcha/api.js'></script>
    <script type="text/javascript">
        function get_action() {
            var v = grecaptcha.getResponse();
            console.log("Resp" + v );
            if (v == '') {
                document.getElementById('captcha').innerHTML = "You can't leave Captcha Code empty";
                return false;
            }
            else {
                document.getElementById('captcha').innerHTML = "Captcha completed";
                return true;
            }
        }
    </script>
</head>
<body>
    <form id="form1" onsubmit="return get_action();">
    <div>
    <div class="g-recaptcha" data-sitekey="6LdNIlAUAAAAADS_uVMUayu5Z8C0tw_jspdntbYl"></div>
    </div>
   <input type="submit" value="Button" />
   
    <div id="captcha"></div>
    </form>
</body>
</html>

请你帮帮我。我会很感激我如何验证它,因为我需要使用javascript函数onsubmit="return get_action();"而不是action="file.php"*当我提交时?:

4

2 回答 2

7

grecaptcha.getResponse()函数只会为您提供用户响应令牌,然后必须通过HTTP POST调用 google reCAPTCHA 服务器对其进行验证。

您可以使用 AJAX 请求来验证令牌,但出于安全原因,这些验证应始终在服务器端完成- JavaScript 可能总是被用户干预并被欺骗相信 reCAPTCHA 已成功验证。

谷歌验证码文档

获取响应令牌后,您需要使用以下 API 使用 reCAPTCHA 进行验证,以确保令牌有效。

因此,您需要做的是将您的 reCAPTCHA 密钥(在 reCAPTCHA 管理页面中为您生成的第二个密钥)和用户响应令牌(从grecaptcha.getResponse()函数接收的令牌)发送到 reCAPTCHA API,如reCAPTCHA docs中所述。

在 PHP中,你会做这样的事情:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'secret'   => YOUR_RECAPTCHA_SECRET,
    'response' => USER_RESPONSE_TOKEN,
]));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);

curl_close($ch);

$response = @json_decode($data);

if ($response && $response->success)
{
    // validation succeeded, user input is correct
}
else
{
    // response is invalid for some reason
    // you can find more in $data->{"error-codes"}
}
于 2018-03-31T22:11:16.243 回答
0

这就是我的建议...

1.) 将查询字符串附加到您的 reCPATCHA 脚本。此外,为了获得更好的性能,防止渲染阻塞,您可以将async defer属性添加到<script ...>. 为了正确起见,您应该将脚本移动到<form>DOM 之后。...</form> <script src='https://www.google.com/recaptcha/api.js?onload=recaptchaRender' async defer></script>.

2.) 添加一个名为recaptchaRender(). 处理您对 Google 的验证并将响应卸载到您的回调get_action。替换RECAPTCHA_SITE_KEY为您的 Google 站点密钥。

function recaptchaRender{
    grecaptcha.render( 'reCaptchSubmit', {
        'sitekey': 'RECAPTCHA_SITE_KEY',
        'callback': get_action
    });
}

3.) 添加id="reCaptchSubmit"到您的提交按钮。

4.)onsubmit="return get_action();"从您的表单元素中删除。

本质上,您缺少脚本和 Google 之间的身份验证。这不会处理您的表单验证,但至少会让您进入您的渲染回调get_action(),您可以在其中处理验证 - 可能想要重命名为更相关的东西,例如validateForm()

于 2018-03-31T22:35:00.310 回答