Google reCAPTCHA:如何在服务器端获取用户响应和validation

我正在做一个Java(JSP + Servlet)Web应用程序(我知道这个问题与技术无关)。 我希望使用最新的Goolge reCAPTCHA服务。

我正在玩这里找到的Goolge reCAPTCHA示例:

https://developers.google.com/recaptcha/docs/display#config

  reCAPTCHA demo: Simple page    

我能够看到显示的recaptcha图像如下:

在此处输入图像描述

当我检查“我不是机器人”时,我得到以下信息:

在此处输入图像描述

如您所见,有一个validation按钮,根据我的测试,用户响应会发送给Google进行validation。

如何获取用户响应,以便我可以在自己的后端代码中validation用户响应(如Google建议的https://developers.google.com/recaptcha/docs/verify )。

 g-recaptcha-response POST parameter when the user submits the form on your site 

在服务器端,我可以通过单击“提交”按钮,仅在首先使用Google成功validation用户时从参数“g-recaptcha-response”获取用户输入。 否则,“g-recaptcha-response”在服务器端是空白的。 这意味着只有在客户端validation成功后才能进行服务器端validation。 如果是这样,在服务器端进行另一次validation有什么意义,这是Google reCAPTHA提供的选项?

我错过了什么吗?

关于新版Google Recaptcha的一个很酷的事情是,validation现在完全封装在小部件中。 这意味着,小部件将负责提出问题,一直validation响应,直到确定用户实际上是人,然后才能获得g-recaptcha-response值。

但这并不能保证您的网站免受HTTP客户端请求伪造。

任何具有HTTP POST知识的人都可以将随机数据放在g-recaptcha-response表单字段中,然后在您的站点中让它认为该字段是由google小部件提供的。 所以你必须validation这个令牌。

在人类的演讲中,它会像,

  • 你的服务器 :嘿谷歌,有一个老兄告诉我他不是机器人。 他说你已经证实他是一个人,他告诉我给你这个标记作为certificate。
  • 谷歌 :嗯…让我检查这个标记……是的我记得这个家伙我给了他这个标记……是的,他是用肉和骨头让他通过的。
  • 你的服务器 :嘿谷歌,还有另一个家伙告诉我他是一个人。 他还给了我一个代币。
  • 谷歌 :嗯……这和你上次给我的一样……我很确定这个人试图欺骗你。 告诉他离开你的网站。

validation响应非常简单。 只需提出GET请求即可

https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

并将response_string替换为您之前通过g-recaptcha-response字段获得的值。

您将获得带有成功字段的JSON响应。

有关详情,请访问: https //developers.google.com/recaptcha/docs/verify

我在登录servlet中使用的方法来validationreCaptcha响应。 使用java.json包中的类。 返回JsonObject中的API响应。

检查成功字段是true还是false

 private JsonObject validateCaptcha(String secret, String response, String remoteip) { JsonObject jsonObject = null; URLConnection connection = null; InputStream is = null; String charset = java.nio.charset.StandardCharsets.UTF_8.name(); String url = "https://www.google.com/recaptcha/api/siteverify"; try { String query = String.format("secret=%s&response=%s&remoteip=%s", URLEncoder.encode(secret, charset), URLEncoder.encode(response, charset), URLEncoder.encode(remoteip, charset)); connection = new URL(url + "?" + query).openConnection(); is = connection.getInputStream(); JsonReader rdr = Json.createReader(is); jsonObject = rdr.readObject(); } catch (IOException ex) { Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); } finally { if (is != null) { try { is.close(); } catch (IOException e) { } } } return jsonObject; } 

嗨,好奇你可以在客户端validation你的谷歌recaptcha也100%工作 ,我validation你的谷歌recaptcha只是看到下面的代码
这个代码在html主体:

  

这段代码放在head部分调用get_action(this)方法表单按钮:

 function get_action(form) { var v = grecaptcha.getResponse(); if(v.length == 0) { document.getElementById('captcha').innerHTML="You can't leave Captcha Code empty"; return false; } if(v.length != 0) { document.getElementById('captcha').innerHTML="Captcha completed"; return true; } }