结合Recaptcha v2和v3

时间:2019-01-16 10:53:50

标签: recaptcha

我热衷于使用ReCaptcha v3进行登录和登录,但我不确定如何处理“低评分”,拒绝访问没有安全感,用户无法前进。感觉更完整的解决方案是,如果分数太低,则将v3的“评分”与v2的难题挑战相结合。其他人如何处理这个问题?

另外,似乎v3的grecaptcha.execute返回的结果与v2类似,也就是说它没有返回评级,只是TOKEN得到了与v2相似的验证?< / p>

我发现我的代码演示了它们都可以在同一HTML中使用...

<!-- https://github.com/google/recaptcha/issues/279 -->
<script src="https://www.google.com/recaptcha/api.js?onload=v2_onload"></script>
<script src="https://www.google.com/recaptcha/api.js?onload=v3_onload&render=V3_SITE_KEY"></script>
<script src='https://www.google.com/recaptcha/api.js?render=V3_SITE_KEY'></script>
<div class="g-recaptcha" data-size="invisible" data-sitekey="V2_SITE_KEY" data-callback="v2_callback"></div>
<script type="text/javascript">
    function v2_onload() { console.log('v2 loaded'); }
    function v3_onload() { console.log('v3 loaded'); }
    function v2_callback(token) { console.log('v2 token: ' + token); }
    function v3_callback(token, score) { console.log('v3 token: ' + token +    " ----- " + score); }

    // call these manually
    function test_v2() { grecaptcha.execute(); }
    function test_v3() { 
    grecaptcha.execute('V3_SITE_KEY' , {action:'thisIsATest' }).then(v3_callback); 
}

然后我担心,如果v3也需要服务器端验证,那么为了实现v2,也可以重新加载页面以调用v2(当服务器端说“低等级”时,然后重新加载并启用v2)或v3服务器端验证可以通过ajax调用来完成,但是感觉就像可以由bot检查和操纵的东西(抓住ajax响应,将“ no”更改为“ yes”,然后让bot本身调用“ callback”函数)获得访问权限)

任何帮助或建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

仅通过表单发布发送令牌并仔细检查服务器端是否最简单?我知道您仍然可能允许漫游器将数据发布到系统中,但是可以被Google偷偷摸摸的漫游器应该很少见。服务器端逻辑应该做的第一件事就是验证令牌,该令牌不容易被伪造。就是说,在我对google V3(10K请求)的初步分析中,僵尸程序检测完全是二进制的,因为所有得分都高于或低于.5。 Google在其文档中针对这种情况建议了不同的策略来处理可疑流量。

  

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

答案 1 :(得分:0)

reCAPTCHA 的官方常见问题网站上似乎有此问题的答案。

Can I run reCAPTCHA v2 and v3 on the same page?

为此,请将 v3 站点密钥加载为documented,然后使用grecaptcha.render显式渲染 v2

<html>
  <head>
    <title>reCAPTCHA demo: Running both v2 and v3</title>
    <script src="https://www.google.com/recaptcha/api.js?render=v3_site_key"></script>
    <script>
      grecaptcha.ready(() => {
        grecaptcha.render('html_element', {
           'sitekey' : 'v2_site_key'
        });
      });
    </script>
    <script>
      function onSubmit() {
        grecaptcha.ready(() => {
            grecaptcha.execute('v3_site_key', {action: 'homepage'}).then((token) => {
               ...
            });
        });
      }
    </script>
  </head>
</html>