防止暴力破解比乍看起来要棘手。解决方案是组合控制——单一控制并不能满足要求。请记住目标:您希望减缓暴力攻击的速度,使其要么无效,要么您可以检测到它并采取行动。第二种选择通常比第一种更有效。
您可以使用验证码(这是目前流行的技术),但验证码通常可以自动读取,当计算机无法读取验证码时,可以通过支付低工资工人或使用验证码来获得人口农场保护“免费”色情内容(两种技术都已使用)。
其他人关于在表单中使用秘密值的建议并没有真正的帮助;攻击者只需解析 HTML 即可找到秘密值,并将其包含在他们的帖子中。这很容易自动化,所以这并不是一个很好的防御。哦,如果结果证明该值很容易预测(使用糟糕或损坏的 PRNG 或坏种子),那么您又陷入了困境。
跟踪 IP 地址是可以的,但前提是您不支持 NAT。使用 NAT,有效用户将看起来是重复的。请记住,攻击者可以冒充其他系统;单个攻击系统可以使用其他 IP 地址,甚至拦截到该系统的流量(ARP 中毒是一种很好的机制)。
您可以在给定时间段内使用最大失败超时次数(例如 1 小时内 3 次)。这会减慢攻击者的速度,但不一定能阻止他们。您可能会包含自动解锁,但您需要做一些数学计算,并确保解锁时间确实有用。
指数退避是另一种有用的机制。这可能会将会话(攻击者不必返回到服务器)绑定到 IP 地址(与 NAT 中断)或帐户(不考虑跨多个帐户的暴力破解) 。
为了使其他防御措施发挥作用,您必须拥有强密码。如果您的密码很容易被猜到(它们在字典中吗?它们很短吗?它们很复杂吗?),攻击就会成功。实现最低密码强度要求和“非法密码”字典(与该字典的常见字符替换相结合)是一个好主意。或者,您可以使用 OATH、证书登录或硬件令牌(如 RSA 的 SecurID)等系统。
我认为是伯特·卡利斯基讨论了客户的难题。基本上,你给客户端一个对服务器来说很容易但对客户端来说很困难的挑战;客户端通过浪费自己的资源试图解决这个难题来自我解决。这里的困难在于确定谜题的正确复杂性。例如,它可能需要对一个大数进行因式分解。无论它是什么,您都必须假设最有效的算法,并且您必须能够处理不同机器上不同浏览器的不同性能(可能很慢),同时减慢浏览器外部的自动攻击(可能比你的 JavaScript)。我是否提到过您必须用 JavaScript 实现解决方案?
但您仍然受到跨多个帐户的攻击的困扰。我不知道有任何公开使用的控件可以很好地解决此问题,除非您可以跟踪 IP 地址。
然后,您需要保护用户名。不知道用户名的攻击者(需要一个不指示用户名何时有效的系统)将必须学习用户名和密码,而不是轻松确认用户名,然后只攻击密码。
并且您需要小心错误消息和服务器计时也不会泄露有效密码。
当您处理错误消息时,请确保密码恢复机制不会泄露任何信息。即使在其他方面良好的系统中,密码恢复也会毁掉整个事情。
但是,尽管如此,攻击最终取决于服务器的性能。您可能只是实现一个非常慢的身份验证机制(对于有效和无效的身份验证都必须很慢)。在线攻击的速度保证不会超过服务器处理请求的速度。
然后,您需要检测暴力攻击,因此您的系统需要良好的审计跟踪。但您需要小心,不要记录太多日志消息,否则您将通过填满磁盘空间来开辟一种简单的方法来管理服务器。像 syslog 的“上一条消息已被接收 1000 次”这样的消息就很好了。
一旦你完成了所有的设计,并再次完成了实现,你将需要检查整个系统以及系统的所有功能,在给定当前设置和服务器性能的情况下对其进行数学建模,并确定攻击者暴力破解 (a) 单个帐户和 (b) 任何帐户(跨帐户暴力破解以避免特定于帐户的控制)所需的平均时间。