将 recaptcha token 列入白名单以避免要求用户生成新的 token,有没有更好的解决方案?
Whitelisting recaptcha tokens to avoid asking users to generate new tokens, is there a better solution?
我有一个网站,该网站的表单带有验证码。该表单有很多无法移动到客户端的服务器端验证,因此用户通常会提交多个具有相同 recaptcha 令牌的表单。问题是 recaptcha 不是很适合多重验证。
根据google's recaptcha documentation:
Each reCAPTCHA user response token can only be verified once.
如果有人尝试多次验证同一个令牌,google 的 api returns timeout-or-duplicate
。
因此,为了让表单拥有流畅的用户体验,而不是在每次用户提交未通过服务器端验证的表单时再次请求填写验证码,我要么需要将验证码令牌验证推迟到服务器端验证结束(这会减慢服务器速度)或者我需要将验证码令牌列入白名单,例如 3 分钟。但是,将验证码列入白名单 3 分钟意味着有人可以制造一个机器人攻击我的网站 3 分钟...
我觉得上面的解决方案可能在安全方面有所妥协,所以我想知道常见的做法是什么,或者你们是否有更好的解决方案。谢谢!
我认为标准做法是在用户第一次通过 reCAPTCHA 时设置一个 cookie 或会话变量,并使用该指标来决定是否 display/check reCAPTCHA。然后您可以为该指标设置一个有效期,或者无限期保留它。
现在开始安全问题。 reCAPTCHA 和其他人性验证机制的目的不一定是完全阻止机器人使用您的服务,而是减少使用您的服务的机器人数量,以及攻击者尝试新攻击的速度。您正在为任何需要手动干预或大量资源投入的攻击添加一个步骤;无论哪种方式,您都在增加攻击者尝试一次攻击所需的时间,并限制他们可以尝试同时进行的攻击的绝对数量。如果攻击者需要首先解决 50 个不同的 reCAPTCHA,则他们无法启动 50 个客户端并立即发起 50 次攻击。这种使攻击变得更加困难和缓慢而不是完全不可能的想法是大多数安全系统和模式背后的基本概念。
考虑到这一点,与让他们在会话开始时解决单个 reCAPTCHA 相比,强制您的用户对每个请求都解决 reCAPTCHA 给您带来的优势微乎其微;我认为用户体验问题超过了安全收益。让最初的 reCAPTCHA 完成它的工作,使攻击者难以同时启动多个攻击会话,并使用一些简单的 user-activity 启发式(即在尽可能多的秒内提交 20 次表单)来查找并踢出他们创建的攻击会话。
我有一个网站,该网站的表单带有验证码。该表单有很多无法移动到客户端的服务器端验证,因此用户通常会提交多个具有相同 recaptcha 令牌的表单。问题是 recaptcha 不是很适合多重验证。
根据google's recaptcha documentation:
Each reCAPTCHA user response token can only be verified once.
如果有人尝试多次验证同一个令牌,google 的 api returns timeout-or-duplicate
。
因此,为了让表单拥有流畅的用户体验,而不是在每次用户提交未通过服务器端验证的表单时再次请求填写验证码,我要么需要将验证码令牌验证推迟到服务器端验证结束(这会减慢服务器速度)或者我需要将验证码令牌列入白名单,例如 3 分钟。但是,将验证码列入白名单 3 分钟意味着有人可以制造一个机器人攻击我的网站 3 分钟...
我觉得上面的解决方案可能在安全方面有所妥协,所以我想知道常见的做法是什么,或者你们是否有更好的解决方案。谢谢!
我认为标准做法是在用户第一次通过 reCAPTCHA 时设置一个 cookie 或会话变量,并使用该指标来决定是否 display/check reCAPTCHA。然后您可以为该指标设置一个有效期,或者无限期保留它。
现在开始安全问题。 reCAPTCHA 和其他人性验证机制的目的不一定是完全阻止机器人使用您的服务,而是减少使用您的服务的机器人数量,以及攻击者尝试新攻击的速度。您正在为任何需要手动干预或大量资源投入的攻击添加一个步骤;无论哪种方式,您都在增加攻击者尝试一次攻击所需的时间,并限制他们可以尝试同时进行的攻击的绝对数量。如果攻击者需要首先解决 50 个不同的 reCAPTCHA,则他们无法启动 50 个客户端并立即发起 50 次攻击。这种使攻击变得更加困难和缓慢而不是完全不可能的想法是大多数安全系统和模式背后的基本概念。
考虑到这一点,与让他们在会话开始时解决单个 reCAPTCHA 相比,强制您的用户对每个请求都解决 reCAPTCHA 给您带来的优势微乎其微;我认为用户体验问题超过了安全收益。让最初的 reCAPTCHA 完成它的工作,使攻击者难以同时启动多个攻击会话,并使用一些简单的 user-activity 启发式(即在尽可能多的秒内提交 20 次表单)来查找并踢出他们创建的攻击会话。