有上述限制的完美方法吗?
解决方法
跟踪给定IP地址的连续失败尝试次数以及任何给定的帐户ID(用户名/电子邮件).使用包含IP,日期和帐户ID列的失败尝试表.限制一段时间内尝试登录的次数.
答案很长
客户不可信任
你说的是你不能使用cookie或会话状态(由cookie保存)是正确的,因为攻击者可以简单地使用新cookie或者根本不使用任何尝试,从而欺骗你的系统.在任何情况下都不应该按照另一个答案的建议在客户端完成.永远不应该信任客户.但是你需要以某种方式跟踪攻击者,而不使用cookie的唯一可行方法就是通过他们的IP地址.
跟踪IP&限制尝试
IP地址可能是欺骗性的,但是无论如何,一个能够集体攻击的动机攻击者可能会使用更复杂的方法.您需要通过IP记录每次登录尝试,并在每次尝试时检查您的尝试日志是否在尝试帐户的最后N小时内包含至少5次或更多次尝试.您可能还希望限制来自给定IP的任何帐户的总尝试次数,以防止攻击者在几个小时的时间内在多个帐户上强制使用相同的组合.
锁定帐户
或者,您可以连续几次尝试锁定违规帐户几个小时(虽然我反对这一点 – 您的用户永远不会因为您的安全性不足而受到影响).请记住,任何形式的成功社交工程和密码重用都会阻碍您的最佳尝试,因此强制实施强密码策略至关重要.
自动密码重置
您可以采取其他辅助措施来使统计上不值得尝试,例如自动密码重置,并将访问链接发送到用户帐户.这些类型的操作取决于产品的性质以及您要保护的内容.例如,由于受损帐户的严重性,银行网站会锁定连续错误尝试次数太多的帐户.
使用验证码
也许我要规定的最简单的威慑力是在任何给定IP连续3次尝试失败之后要求强大的CAPTCHA(我推荐ReCAPTCHA),无论用户/电子邮件是否尝试过.同一IP后面的用户可能必须立即进入CAPTCHA,因为其他用户尝试失败,但这是为安全性付出的小代价.作为ReCAPTCHA面对的攻击者,我会放弃.
延迟尝试
一种不那么有冲击力的方法是通过在连续3次尝试失败后引入合成认证延迟来限制密码尝试次数.这通过限制超过N小时的尝试次数来降低暴力攻击的可行性,当与强制密码到期策略相结合将阻止暴力攻击时.
在旁注中,请确保仅存储用户密码的盐渍哈希值,每个密码使用不同的盐,并拒绝常用密码和字典单词.