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请求即可
并将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; } }