如何使用 javascript/jQuery 验证 google reCAPTCHA v2?

IT技术 javascript jquery asp.net google-api recaptcha
2021-01-30 23:57:35

我在 aspx 中有一个简单的联系表格。我想在提交表单之前验证 reCaptcha(客户端)。请帮忙。

示例代码:

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Test Form</title>
        <link rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
        <script src="//code.jquery.com/jquery-1.10.2.js"></script>
        <script src="//code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
        <link rel="stylesheet" href="/resources/demos/style.css">
        <script src="https://www.google.com/recaptcha/api.js" async defer></script>
        <script>
            $("#cmdSubmit").click(function () {
                //need to validate the captcha
            });
        </script> 
    </head>
    <body>
        <form id="form1" runat="server">
            <label class="clsLabe">First Name<sup>*</sup></label><br />
            <input type="text" id="txtFName" name="txtFName" class="clsInput" /><br />
            <div class="g-recaptcha" data-sitekey="my_key"></div>
            <img id="cmdSubmit" src="SubmitBtn.png" alt="Submit Form" style="cursor:pointer;" />
        </form>
    </body>
    </html>

我想在cmdSubmit点击时验证验证码

请帮忙。

6个回答

这个客户端验证reCaptcha- 以下对我有用:

如果在客户端grecaptcha.getResponse();返回时未验证 reCaptcha null,则返回null.

Javascript代码:

var response = grecaptcha.getResponse();

if(response.length == 0)
    //reCaptcha not verified

else
    //reCaptch verified
但这还不是全部@CoalaWeb!引用:获得响应令牌后,您需要使用以下 API 使用 reCAPTCHA对其进行验证,以确保令牌有效。 https://developers.google.com/recaptcha/docs/verify
2021-03-16 23:57:35
对于那些说答案不正确的人,您甚至阅读了问题吗?问题和答案都清楚地指定了客户端 - 明显的意图是向服务器发送发布请求以进行进一步验证之前检查验证码是否实际上已在客户端填写
2021-03-16 23:57:35
您只能知道用户是否真的在客户端填写了它。'g-recaptcha-response' 的值将被填写,但需要将其发送给 Google 以便他们检查响应是否有效。例如,对于图像匹配,您可以单击任何内容或不单击任何内容,然后单击提交。这是不正确的,但填写了 'g-recaptcha-response' 的值。您可以使用 AJAX 来验证它,但一定要在服务器端代码中保留您的密钥。简短的回答是服务器必须检查它是否有效,无论您是使用 AJAX 还是完整的表单发布。
2021-03-16 23:57:35
引用:当最终用户解决 reCAPTCHA 时,将在 HTML 中填充一个新字段 (g-recaptcha-response)。developer.google.com/recaptcha/docs/verify
2021-03-19 23:57:35
这是不正确的。Captcha 尚未经过 JS 验证,您需要将响应以及您的站点密钥和密钥从后端代码提交到 Google 的服务器,以确定 Captcha 是否已成功回答。这个答案是危险的错误。
2021-03-23 23:57:35

使用它通过简单的 javascript 验证谷歌验证码。

html 正文中的此代码:

<div class="g-recaptcha" id="rcaptcha" style="margin-left: 90px;" data-sitekey="my_key"></div>
<span id="captcha" style="margin-left:100px;color:red" />

这段代码放在调用 get_action(this) 方法表单按钮的头部部分:

function get_action(form) 
{
    var v = grecaptcha.getResponse();
    if(v.length == 0)
    {
        document.getElementById('captcha').innerHTML="You can't leave Captcha Code empty";
        return false;
    }
    else
    {
        document.getElementById('captcha').innerHTML="Captcha completed";
        return true; 
    }
}
Mahmut 是正确的,这个答案错误且不完整。
2021-03-22 23:57:35
我认为这是更好的解决方案。通过这种方式,您可以在表单提交处理程序中处理响应的验证。这似乎比尝试在验证码回调上处理它更合乎逻辑。我想这取决于您是即时验证还是提交验证。
2021-03-28 23:57:35
这个解决方案是错误的。我认为当您得到响应时,您必须将参数(响应 + 密钥 + ClientIp)发送到谷歌进行验证。验证后。谷歌回报我们成功或失败。在您的示例中,您不使用第二步。你能解释一下吗:你的私钥在哪里。你什么时候用?
2021-03-29 23:57:35
你应该使用===!==; 没有理由不这样做。
2021-04-01 23:57:35
<div class="g-recaptcha" id="rcaptcha" style="margin-left: 90px;" data-sitekey="my_key"></div> 这段代码就在 body 部分的 span 标签上方
2021-04-12 23:57:35

如果您在回调中呈现 Recaptcha

<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>

使用空的 DIV 作为占位符

<div id='html_element'></div>

那么您可以在成功的 CAPTCHA 响应上指定一个可选的函数调用

var onloadCallback = function() {
    grecaptcha.render('html_element', {
      'sitekey' : 'your_site_key',
      'callback' : correctCaptcha
    });
  };

然后,recaptcha 响应将发送到“correctCaptcha”功能。

var correctCaptcha = function(response) {
    alert(response);
};

所有这些都来自 Google API 说明:

Google Recaptcha v2 API 说明

我有点不确定你为什么要这样做。通常,您会将 g-recaptcha-response 字段与您的私钥一起发送,以安全地验证服务器端。除非您想在 recaptcha 成功或类似情况下禁用提交按钮 - 在这种情况下,上述方法应该有效。

希望这可以帮助。

保罗

从头开始,我想通了 - 您的部分代码不正确,所以我会建议进行编辑。干杯!
2021-03-24 23:57:35
@Prefix 你提出编辑了吗?期待你的版本。
2021-03-28 23:57:35
正确的Captcha 回调函数声明(在grecaptcha.render 中)应该没有引号并且应该放在onloadCallback 之前。
2021-03-31 23:57:35

简化保罗的回答:

来源:

<script src="https://www.google.com/recaptcha/api.js"></script>

HTML:

<div class="g-recaptcha" data-sitekey="YOUR_KEY" data-callback="correctCaptcha"></div>

JS:

var correctCaptcha = function(response) {
        alert(response);
    };
这以某种方式导致我的元素出现问题。如果我们在元素内部使用数据回调,Webpack 将无法自行编译
2021-03-25 23:57:35
像许多其他错误的解决方案一样,您只是在此处获取令牌。在您将其与您的密钥发送给 Google 之前,您尚未对其进行验证
2021-03-27 23:57:35
这应该是公认的答案,因为它不需要覆盖渲染函数。至于纯粹在 JS 中的验证,我怀疑这是可能的,因为它需要将密钥放入 JS 中,从而让每个人都能掌握它。
2021-03-27 23:57:35

我使用了 HarveyEV 的解决方案,但误读了它并使用 jQuery 验证而不是 Bootstrap 验证器来完成它。

  <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js"></script>
  <script>
    $("#contactForm").validate({
      submitHandler: function (form) {
        var response = grecaptcha.getResponse();
        //recaptcha failed validation
        if (response.length == 0) {
          $('#recaptcha-error').show();
          return false;
        }
          //recaptcha passed validation
        else {
          $('#recaptcha-error').hide();
          return true;
        }
      }
    });
  </script>