如何在客户端和服务器站点上验证验证码



我正在使用以下示例在我的网站中构建 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>

如果您使用新的不可见验证码,您只需将其链接到"提交"按钮即可。您无需测试用户是否已"选中复选框",因为不会有一个。

始终需要在服务器端验证验证码。聪明的机器人可以在客户端伪造任何东西。你只想防范愚蠢的机器人吗?

验证码 API 不会报告尝试次数。你只需要相信谷歌。一些"选择所有图像"的挑战是模棱两可的,需要多次尝试是正常的。

如何在客户端验证验证码:

由于您没有在目标 HTML 元素上传递任何 data-* 属性,因此您仍然可以选择将它们作为参数传递grecaptcha.render()api 选项中。除了sitekey,您还可以通过callback: function () {..}.每次成功验证用户时都会调用回调函数,但无法知道用户验证质询失败的次数。

在客户端以编程方式验证用户是否为人类的另一种方法是使用grecaptcha.getResponse()api。如果此 api 返回非零长度字符串令牌,则表示用户已通过验证。顺便说一句,此 api 返回的令牌与提交表单时发送到服务器的令牌相同,如果您想切换到 ajax 发布表单的方式,请记住这一点。

如何在服务器端验证验证码:

提交的表单应具有g-recaptcha-responsePOST参数,该参数需要发送到recaptcha验证服务器以检查其有效性。汤姆已经在对他的回答的评论中发布了PHP验证它的方式。

我可以只依赖客户端验证吗:

不,你不能。您必须使用 recaptcha 验证服务器验证客户端发送的令牌。它侧面的javascript很容易被劫持以返回误报。恶意机器人可以覆盖 recaptcha 脚本的 api 方法并返回自己的值。因此,您必须与 recaptcha 验证服务器核实客户端发送的令牌是否有效。

最新更新