Nei*_*gan 33
您不能使用会话,因为它要求客户端为您存储cookie,并且攻击者不会帮助您.你需要一些全球状态.
您无需费心追踪IP地址,因为坏人只会使用Anonymyzing Proxy.
除非必须(PCI要求),否则不要使用帐户锁定,因为这只是让攻击者DoS您的用户.
您还希望通过使服务器执行太多工作来避免自己操作.
这有效:
验证失败后,将用户名存储在全局状态,并带有计数.count++如果使用该用户名进行更多不成功的身份验证,则会同步 我为此使用redis.
如果count >= threshold,则需要在继续之前解决CAPTCHA值.在登录屏幕上显示CAPTCHA.
一旦成功认证,清除存储的用户名中的全局状态.为用户提供"可信用户代理"HMAC的cookie,以便他们将来不必使用该用户名的CAPTCHA.
您可以对密码执行相同操作,但可能具有更高的阈值.
如果您不喜欢CAPTCHA,则需要工作证明,例如让客户计算并提交非常大数的素因子.
在您使用它的同时,请确保使用bcrypt来对您的密码进行哈希处理,并且成本因子足够高,需要> = 250ms才能对密码进行哈希处理.这会降低服务器速度,但也会降低攻击者的速度.除非它们通过CAPTCHA(如果需要),否则请避免散列.
鼓励用户使用冗长,复杂,令人难忘的?密码,这样他们就更难以暴力破解.
最简单的方法是使用 CDN 提供商(例如 cloudflare ( https://www.cloudflare.com/features-security ))来为您检测机器人,从而为您提供解决方案。许多 CDN 都提供此服务,而 cloudflare 有免费关税。
或者,如果您尝试自己执行此操作,则可以计算数据库中每个用户名的尝试次数,并根据此计数提供验证码。