【问题标题】:Is secret key required for reCAPTCHA 2?reCAPTCHA 2 是否需要密钥?
【发布时间】:2015-11-04 20:47:39
【问题描述】:

我刚刚开始试用 Google 的 reCAPTCHA 工具/服务,不知道它的工作原理。我遵循了似乎对我有用的 2.0 版本指南(在我的本地主机上) - 但我还没有必须使用密钥。仅当主机/域不是“localhost”时才需要密钥吗?

我们的网站依赖于 DWR (AJAX) 而不是表单提交来与我们的后端交互,所以我希望必须以某种方式捕获用户的响应并将其发送到我们的 DWR java 方法,然后我会将其发布到 Google 的验证服务网址。不过,我似乎不需要这样做。

我已将这些添加到我的主 jsp 文件中:

<script src='https://www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit' async defer></script>
...
<div id="captchaDiv"></div>

然后我添加的javascript是:

var onloadCaptchaCallback = function() {
   grecaptcha.render('captchaDiv', {
     'sitekey' : 'MYSITEKEY',
     'callback' : verifyCaptchaCallback
 });
}

var verifyCaptchaCallback = function(g_recaptcha_response) {
   console.log("Response validated.  Not a robot.");
   // thought I would need to add DWR (AJAX) call here to verify the response
   // but this callback is only getting called on a successful response
   // anyway - so no need to verify with google's service URL? 
}

verifyCaptchaCallback 函数只有在用户满足挑战时才会被调用。我还没有使用密钥。我错过了什么吗?或者这是版本 2 的预期工作方式 - 无需服务器端处理?我看到,当我单击挑战图像对话框上的验证按钮时,一个 POST 被发送到谷歌并显然返回一个失败/成功标志,导致 reCAPTCHA 呈现另一个图像挑战或停止。我没有手动将结果发送到谷歌的验证服务 URL - 它似乎是自动发生的。这种行为是否只是因为我仍在使用“localhost”在我的开发人员系统上进行测试而发生 - 一旦 web 应用程序移动到我们的客户系统,该行为就会失败?

感谢您提供的任何澄清。 格雷戈尔

【问题讨论】:

    标签: javascript recaptcha verify


    【解决方案1】:

    您确实需要验证用户点击。看看 reCaptcha 如何works 以及如何insert 它。

    不需要验证谷歌的服务网址?

    您仍然需要使用g_recaptcha_response 值进行验证。但是您需要在服务器端进行!当表单提交到您拥有的服务器时。 POST['g_recaptcha_response'] 在您的服务器上。

    var verifyCaptchaCallback = function(g_recaptcha_response) {
       console.log("Response validated.  Not a robot."); 
       // you can't do this now, since 'g_recaptcha_response' is an encoded value, neither true, nor false. 
    }
    

    在您进行最终验证的服务器上: proxy.php

    header('Content-type: application/json');
    $url=https://www.google.com/recaptcha/api/siteverify;
    $response=POST['g_recaptcha_response'];
    $secret = "<secter_key>"; // you add secret key server side
    $params = array('secret'=> $secret, 'response'=> $response);
    $json=file_get_contents( $url  . '?secret=' . $secret . '&response=' . $response);
    echo $json; // here should be 'true' or 'false' 
    

    更新

    为什么需要进一步验证 google 的 siteverify URL?

    因为在第一次(用户)验证之后,只有 Google 知道用户是否是机器人。它用绿色勾(或不)更新 reCaptcha 框架,并创建隐藏的 g-recaptcha-response textarea 标记,并在标记中返回但编码的值,但 (服务器端的站点所有者)不知道如果用户是真或假。因此,无论是来自 textarea 还是来自回调输入参数,使用这个 g-recaptcha-response 值,您都可以验证您站点上的当前用户(使用站点的 密钥)。仅在服务器端执行此操作,以免泄露密钥。

    如果有必要 - 可以不用 PHP 来完成吗?

    当然可以。您只需将 g-recaptcha-response 值发送到服务器,然后使用 Java(或其他服务器工具)请求 Google 服务器(如果站点经过验证)(阅读 here 文档)。然后在服务器端,您知道用户是否是人类。使用任何技术将结果返回给客户端。

    您也可以从我的auto submit reCaptcha answer 中受益。

    【讨论】:

    • 非常感谢您的回复。在我们的例子中,我们不是提交传统意义上的
      ;我们依靠 DWR (AJAX) 对用户的操作做出反应。在我们的例子中,reCAPTCHA 正在调用我们的 verifyCaptchaCallback 函数,如前所述 - 但它仅在用户成功通过挑战后才调用它 - 所以如果发生了这种情况,那么为什么需要进一步验证 google 的 siteverify URL 的步骤?如果有必要 - 可以不用 PHP 来完成吗?
    • ReCaptcha 旨在防止机器人。机器人根本不需要使用你的前端,它可以直接调用你的后端,忽略你在前端所做的任何检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2020-11-17
    • 2015-06-13
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多