0

我有一个网站,上面有一个带有recaptcha 的表格。表单有很多无法移动到客户端的服务器端验证,因此用户通常使用相同的 recaptcha 令牌提交多个表单。问题是 recaptcha 不太适合多重验证。

根据谷歌的recaptcha文档

每个 reCAPTCHA 用户响应令牌只能验证一次。

如果尝试多次验证同一个令牌,谷歌的 api 会返回timeout-or-duplicate.

因此,为了使表单具有流畅的用户体验,并且每次用户提交未通过服务器端验证的表单时都不会请求再次填写验证码,我要么需要将验证码令牌验证推迟到服务器端 -侧面验证(这会减慢服务器速度),或者我需要将验证码令牌列入白名单,例如 3 分钟。但是,将验证码列入白名单 3 分钟意味着有人可以制造一个机器人来攻击我的网站 3 分钟......

我觉得上述解决方案可能会影响安全性,所以我想知道常见做法是什么,或者你们是否有更好的解决方案。谢谢!

4

1 回答 1

1

我相信标准做法是在用户第一次通过 reCAPTCHA 时设置 cookie 或会话变量,并使用该指标来决定是否显示/检查 reCAPTCHA。然后,您可以为该指标设置有效期,或无限期保留它。

现在进入安全问题。reCAPTCHA 和其他人性验证机制的目的不一定是完全阻止机器人使用您的服务,而是减少使用您的服务的机器人数量,以及攻击者尝试新攻击的速度。您正在为任何需要人工干预或大量投入资源的攻击添加一个步骤;无论哪种方式,您都会增加攻击者尝试一次攻击的时间,并限制他们可以尝试的同时攻击的绝对数量。如果攻击者需要首先解决 50 个不同的 reCAPTCHA,他们就无法启动 50 个客户端并立即发起 50 次攻击。这种使攻击变得更加困难和缓慢而不是完全不可能的想法是大多数安全系统和模式背后的基本概念。

考虑到这一点,与让他们在会话开始时解决单个 reCAPTCHA 相比,强制您的用户在每个请求上解决 reCAPTCHA 几乎没有优势;我认为用户体验问题超过了安全收益。让最初的 reCAPTCHA 让攻击者难以同时启动多个攻击会话,并使用一些简单的用户活动启发式方法(即在几秒钟内提交 20 个表单)来查找并退出他们所做的攻击会话创造。

于 2018-07-17T15:41:16.557 回答