首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reCAPTCHA 2需要密钥吗?

reCAPTCHA 2需要密钥吗?
EN

Stack Overflow用户
提问于 2015-11-04 20:47:39
回答 1查看 5K关注 0票数 2

我刚刚开始试验谷歌的reCAPTCHA工具/服务,对它的工作方式感到困惑。我遵循了2.0版本的指南,这个版本似乎正在为我工作(在我的本地主机上)--但我还没有使用秘密密钥。是否只有当主机/域不是"localhost“时才需要密钥?

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

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

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

然后我添加的javascript是:

代码语言: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的工作方式-不需要服务器端处理?我看到,当我单击质询图像对话框上的“验证”按钮时,一个帖子被发送到谷歌,并明显地返回了一个失败/成功标志,该标志导致reCAPTCHA要么呈现另一个图像挑战,要么停止。我没有手动发送结果到谷歌的验证服务URL -它似乎是自动发生的。这种行为是因为我仍在用"localhost“在我的开发人员系统上进行测试而发生的吗?而且,一旦webapp被转移到我们的客户系统中,这种行为就会失败吗?

谢谢你能提供的任何澄清。格雷果

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-05 15:17:58

您确实需要验证用户的单击。看看reCaptcha 作品是如何实现的,以及如何对其进行插入

不需要用google的服务URL来验证?

您仍然需要使用g_recaptcha_response值进行验证。但你得在服务器端做!当表单被提交到服务器时,您就有了前妻。POST['g_recaptcha_response']在您的服务器上。

代码语言:javascript
复制
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

代码语言:javascript
复制
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' 

更新

为什么还要采取进一步的措施来验证谷歌的站点化URL呢?

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

如果有必要的话,可以不使用PHP来完成吗?

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

您也可能从我的自动提交reCaptcha答案中受益。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33531697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档