如何在表单提交时验证 Google reCaptcha

64

最近,谷歌彻底改进了他们的reCaptcha API,并将其简化为一个复选框。

reCaptcha

问题是,我可以在没有勾选reCaptcha的情况下提交带有reCaptcha的表单,而表单将忽略reCaptcha。

以前,您必须将表单发送到带有私钥等参数的PHP文件,但在他们的开发人员指南中我没有看到任何提及。我不知道如何验证表单以确保用户填写了新的reCaptcha。

难道我漏掉了什么吗?那个带有私钥的PHP文件还是必需的吗?

到目前为止,我的reCaptcha只有:

<div data-type="image" class="g-recaptcha" data-sitekey="My Public Key"></div>
12个回答

85
如果您想检查用户是否点击了“我不是机器人”的复选框,则可以使用reCaptcha API提供的“.getResponse()”函数。如果用户未通过验证,它将返回一个空字符串,例如:
if (grecaptcha.getResponse() == ""){
    alert("You can't proceed!");
} else {
    alert("Thank you");
}

如果用户已经通过验证,响应将是一个非常长的字符串。
有关API的更多信息,请访问此页面:reCaptcha Javascript API

如果我在同一页上有多个Google reCAPTCHA(每个表单中都有一个),那么我该如何使用您上面的答案进行验证? - Juliver Galleto
2
@CodeDemon 请查看 API 文档的此部分:https://developers.google.com/recaptcha/docs/display。在示例中,您将看到如何管理多个 reCaptcha 小部件,每个小部件都有自己的标识符,然后您可以调用 grecaptcha.getResponse(widget1); - Ali Bassam
2
如果有人想要注入恶意数据并创建一个仅设置grecaptcha.response!=“”脚本,该怎么办? - rasgo
2
@msr 客户端验证永远不够,Google 提供了一种在服务器端验证 reCaptcha 的方法,请查看以下链接:http://alibassam.com/how-to-use-googles-new-recaptcha-in-net/ - Ali Bassam
OP在标签中指定了PHP,因此我认为答案应该在后端完成。 - user4367461
显示剩余2条评论

21
根据Google reCAPTCHA文档,您可以通过以下3种方式验证响应:
  1. g-recaptcha-response:一旦用户选中复选框(我不是机器人),一个带有id g-recaptcha-response 的字段将填充在您的HTML中。
    现在,您可以使用此字段的值来确定用户是否为机器人,方法如下:

    var captchResponse = $('#g-recaptcha-response').val();
    if(captchResponse.length == 0 )
        //user has not yet checked the 'I am not a robot' checkbox
    else 
        //user is a verified human and you are good to submit your form now
    
  2. 在你准备提交表单之前,你可以按照以下方式进行呼叫:

  3. var isCaptchaValidated = false;
    var response = grecaptcha.getResponse();
    if(response.length == 0) {
        isCaptchaValidated = false;
        toast('Please verify that you are a Human.');
    } else {
        isCaptchaValidated = true;
    }
    
    
    if (isCaptchaValidated ) {
        //you can now submit your form
    }
    
  4. 您可以按以下方式显示reCAPTCHA:

    <div class="col s12 g-recaptcha" data-sitekey="YOUR_PRIVATE_KEY" data-callback='doSomething'></div>
    

    接着在你的JavaScript中定义该函数,这个函数也可以用来提交表单。

    function doSomething() { alert(1); }
    

    现在,一旦复选框(我不是机器人)被选中,您将获得回调到定义的回调,即您的情况下为doSomething


17

从用户体验角度来看,有助于明确告知用户何时可以提交表单 - 可以通过启用已禁用的按钮或仅仅使按钮可见来实现。

以下是一个简单的示例...

<form>
    <div class="g-recaptcha" data-sitekey="YOUR_PRIVATE_KEY" data-callback="recaptchaCallback"></div>
    <button type="submit" class="btn btn-default hidden" id="btnSubmit">Submit</button>
</form>

<script>
    function recaptchaCallback() {
        var btnSubmit = document.getElementById("btnSubmit");

        if ( btnSubmit.classList.contains("hidden") ) {
            btnSubmit.classList.remove("hidden");
            btnSubmitclassList.add("show");
        }
    }
</script>

1
完全正确!我已经谷歌了几个小时,以使reCAPTCHA与我的Zoho Web To Lead表单配合使用,而这个方法非常好。谢谢你! - Ken
这应该是被接受的答案。最简单的应用程序。 - LOTUSMS
简单而优雅!非常好的回答!谢谢! - KyleBunga
我在控制台收到以下错误信息。 ReCAPTCHA 找不到用户提供的函数:recaptchaCallback。 - Hardik Patil
2
这很好,但有一个重要的警告:在开发控制台或机器人中,“禁用”或“隐藏”可以轻松地被覆盖。我们仍然会收到来自机器人的随机表单提交,它们可能只是编辑页面以启用按钮并提交。你所需要做的就是从HTML控件中删除“disabled”标签,然后你就可以点击“提交”按钮了。 - Boyd P

16
var googleResponse = jQuery('#g-recaptcha-response').val();
if (!googleResponse) {
    $('<p style="color:red !important" class=error-captcha"><span class="glyphicon glyphicon-remove " ></span> Please fill up the captcha.</p>" ').insertAfter("#html_element");
    return false;
} else {            
    return true;
}

将此放入函数中。在提交时调用该函数... #html_element 是我的空 div。


11

使用JavaScript时,它对我有效。

<script src='https://www.google.com/recaptcha/api.js'></script>
<script>
function submitUserForm() {
    var response = grecaptcha.getResponse();
    if(response.length == 0) {
        document.getElementById('g-recaptcha-error').innerHTML = '<span style="color:red;">This field is required.</span>';
        return false;
    }
    return true;
}
 
function verifyCaptcha() {
    document.getElementById('g-recaptcha-error').innerHTML = '';
}
</script>
<form method="post" onsubmit="return submitUserForm();">
    <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY" data-callback="verifyCaptcha"></div>
    <div id="g-recaptcha-error"></div>
    <input type="submit" name="submit" value="Submit" />
</form>


6
您可以先在前端验证复选框是否已标记:
    var recaptchaRes = grecaptcha.getResponse();
    var message = "";

    if(recaptchaRes.length == 0) {
        // You can return the message to user
        message = "Please complete the reCAPTCHA challenge!";
        return false;
    } else {
       // Add reCAPTCHA response to the POST
       form.recaptchaRes = recaptchaRes;
    }

然后在服务器端使用Google reCAPTCHA API验证接收到的响应:

    $receivedRecaptcha = $_POST['recaptchaRes'];
    $verifiedRecaptcha = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$google_secret.'&response='.$receivedRecaptcha);

    $verResponseData = json_decode($verifiedRecaptcha);

    if(!$verResponseData->success)
    {
        return "reCAPTCHA is not valid; Please try again!";
    }

如需更多信息,请访问Google文档


1
这应该是正确的答案,谢谢! - DarkteK

2

在表单提交后验证Google reCaptcha是否有效

if ($post['g-recaptcha-response']) {
      $captcha = $post['g-recaptcha-response'];
      $secretKey = 'type here private key';
      $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=" . $secretKey . "&response=" . $captcha);
        $responseKeys = json_decode($response, true);
        if (intval($responseKeys["success"]) !== 1) {
            return "failed";
        } else {
            return "success";
        }
    }
    else {
        return "failed";
    }

2

1
var googleResponse = $('#g-recaptcha-response').val();

if(googleResponse=='')
{   
    $("#texterr").html("<span>Please check reCaptcha to continue.</span>");

    return false;
}

0

在使用带有reCaptcha DLL文件的Google reCaptcha时,我们可以按照以下方式在C#中进行验证:

 RecaptchaControl1.Validate();
        bool _Varify = RecaptchaControl1.IsValid;
        if (_Varify)
        {
// Pice of code after validation.
}

对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接