显然,限制登录尝试的机制是一项安全要求。虽然我喜欢尝试之间呈指数增加的概念,但我不确定存储信息的方式。我也对替代解决方案感兴趣,最好不包括验证码。
我猜想由于阻止cookie或自动清除它们,cookie不起作用,但会话会起作用吗?还是必须在数据库中存储?由于不知道正在使用哪些方法,因此我不知道什么是实际可行的。
显然,限制登录尝试的机制是一项安全要求。虽然我喜欢尝试之间呈指数增加的概念,但我不确定存储信息的方式。我也对替代解决方案感兴趣,最好不包括验证码。
我猜想由于阻止cookie或自动清除它们,cookie不起作用,但会话会起作用吗?还是必须在数据库中存储?由于不知道正在使用哪些方法,因此我不知道什么是实际可行的。
在你的用户表中使用'failed_login_attempts'和'failed_login_time'列。第一列表示登录失败次数,每次失败都会加1,而成功登录则会将其重置为0。第二列可以让你比较当前时间和最后一次登录失败的时间。
你的代码可以利用数据库中的这些数据来确定锁定用户的等待时间、允许登录之间的时间等等。
虽然这里的答案解决了对个人用户的猜测攻击,但这种方法的一个主要问题是它将系统留给了拒绝服务攻击。来自世界各地的任何请求都不应该触发数据库工作。
应该在 req/ res 周期的早期实施替代(或附加)安全层,以保护应用程序和数据库免受执行昂贵且不必要的锁定操作的影响。
Express-Brute 是一个很好的例子,它利用 Redis 缓存来过滤恶意请求,同时允许诚实的请求。
当你知道哪个用户ID被攻击时,保持一个标志,当它达到阈值时,停止接受该用户的任何请求。但这意味着你要为每个用户存储额外的数据值。
我喜欢指数级增长尝试之间时间的概念,[...]
除了使用指数级增长的时间,你可以实际上在连续的尝试之间设置随机延迟。
也许如果你解释一下你正在使用的技术,这里的人们将能够提供更具体的示例。
将信息存储在服务器端。这样可以防御来自多台机器的分布式攻击。
你可能想要在一定时间内阻止登录,例如在3次失败尝试后的10分钟内。我认为指数级增加的时间听起来不错。是的,在服务器端会话或数据库中存储信息。数据库更好。不使用cookie,因为用户很容易操纵。
你可能还想将这些尝试映射到客户端IP地址,因为很可能有效用户会收到被阻止的消息,而其他人正在尝试猜测有效用户的密码。