我使用下面的示例在我的网站上构建ReCaptcha。 我想知道如何在客户端站点和服务器站点验证这一点。 是否足以验证用户是否已选中客户端的复选框而不检查服务器站点? 此外,我需要计算用户未能验证验证码的次数。
<html>
<head>
<title>reCAPTCHA demo: Explicit render after an onload callback</title>
<script type="text/javascript">
var onloadCallback = function() {
grecaptcha.render('html_element', {
'sitekey' : 'your_site_key'
});
};
</script>
</head>
<body>
<form action="?" method="POST">
<div id="html_element"></div>
<br>
<input type="submit" value="Submit">
</form>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
async defer>
</script>
</body>
</html>
答案 0 :(得分:1)
如果您使用新的隐形recaptcha,只需将其链接到“提交”按钮即可。您不需要测试用户是否“选中了复选框”,因为没有一个。
总是需要在服务器端验证recaptcha。聪明的机器人可以在客户端伪造任何东西。你只想防止哑巴机器人吗?
recaptcha API不会报告尝试次数。你只需要相信Google就可以了。一些“选择所有图像”的挑战是模糊的,并且需要多次尝试是正常的。
答案 1 :(得分:0)
如何验证客户端的重新接收:
由于您没有在目标HTML元素上传递任何data- *属性,您仍然可以选择将它们作为grecaptcha.render()
api选项中的参数传递。与sitekey
一起,您可以通过callback: function () {..}
。每次成功验证用户时都会调用回调函数,但无法知道用户验证失败次数的次数。
在客户端以编程方式验证用户是否经过验证的另一种方法是使用grecaptcha.getResponse()
api。如果此api返回非零长度的字符串标记,则表示用户已经过验证。顺便说一下,这个api返回的令牌与提交表单时发送给服务器的令牌是一样的,如果你想切换到ajax发布表单的方式,请记住这一点。
如何验证服务器端的重新连接:
提交的表单应该有g-recaptcha-response
POST参数,需要将其发送到recaptcha验证服务器以检查其有效性。汤姆已经在评论中发布了PHP验证方式。
我是否可以仅依赖客户端验证:
不,你不能。您必须使用recaptcha验证服务器验证客户端发送的令牌。它侧面的javascript很容易被劫持以返回误报。恶意bot可以覆盖recaptcha脚本的api方法并返回自己的值。因此,您必须使用recaptcha验证服务器检查客户端发送的令牌是否有效。