Javascript 如何在客户端和服务器站点上验证recaptcha

Javascript 如何在客户端和服务器站点上验证recaptcha,javascript,checkbox,google-api,recaptcha,Javascript,Checkbox,Google Api,Recaptcha,我使用下面的例子在我的网站上构建ReCaptcha。 我想知道如何在客户端站点和服务器站点中验证这一点。 验证用户是否已选中客户端的复选框而未选中服务器站点上的复选框是否足够? 我还需要计算用户验证验证码失败的次数 <html> <head> <title>reCAPTCHA demo: Explicit render after an onload callback</title> <script type="text/

我使用下面的例子在我的网站上构建ReCaptcha。 我想知道如何在客户端站点和服务器站点中验证这一点。 验证用户是否已选中客户端的复选框而未选中服务器站点上的复选框是否足够? 我还需要计算用户验证验证码失败的次数

<html>
  <head>
    <title>reCAPTCHA demo: Explicit render after an onload callback</title>
    <script type="text/javascript">
      var onloadCallback = function() {
        grecaptcha.render('html_element', {
          'sitekey' : 'your_site_key'
        });
      };
    </script>
  </head>
  <body>
    <form action="?" method="POST">
      <div id="html_element"></div>
      <br>
      <input type="submit" value="Submit">
    </form>
    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
        async defer>
    </script>
  </body>
</html>

reCAPTCHA演示:在onload回调后显式呈现
var onloadCallback=函数(){
render('html\u元素'{
“站点密钥”:“您的站点密钥”
});
};


如果使用新的不可见的recaptcha,只需将其链接到提交按钮即可。您不需要测试用户是否“选中了复选框”,因为没有复选框

您始终需要在服务器端验证recaptcha。聪明的机器人可以在客户端伪造任何东西。你只想保护自己免受愚蠢的机器人攻击吗


recaptcha API不报告尝试次数。在这一点上,你只需要相信谷歌。一些“选择所有图像”的挑战是不明确的,需要多次尝试是正常的

如何在客户端验证recaptcha:

由于您没有在目标HTML元素上传递任何data-*属性,因此您仍然可以选择在
grecaptcha.render()中作为参数传递它们。与
sitekey
一起,您可以传递
callback:function(){..}
。每次成功验证用户时,都会调用回调函数,但无法知道用户验证质询失败的次数

另一种通过编程在客户端验证用户是否为人类的方法是使用
grecaptcha.getResponse()
api。如果此api返回长度非零的字符串令牌,则表示用户已验证。顺便说一句,此api返回的令牌与提交表单时发送到服务器的令牌相同,如果您想切换到ajax方式发布表单,请记住这一点


如何在服务器端验证recaptcha:

提交的表单应该有一个
g-recomptcha-response
POST参数,需要发送到recomptcha验证服务器以检查其有效性。Tom已经在对他的回答的评论中发布了PHP验证方法

我能否仅依靠客户端验证:


不,你不能。您必须使用recaptcha验证服务器验证客户端发送的令牌。It端javascript很容易被劫持以返回误报。恶意bot可以覆盖recaptcha脚本的api方法并返回自己的值。因此,您必须向recaptcha验证服务器检查客户端发送的令牌是否有效。

如何在服务器端验证recaptcha?
$s='your secret'$r=$_POST['g-recaptcha-response']$v=文件获取内容(“https://www.google.com/recaptcha/api/siteverify?secret=$s&response=$r“;echo json_解码($v)->成功通过:'不通过'这是否回答了您的问题?