如果我的网站使用 POST 表单进行登录,那么有什么快速简便的方法可以防止流氓客户端用 POST 请求淹没我的 Web 服务器,试图暴力破解我的用户帐户?
PHP/MySQL/Apache。
如果我的网站使用 POST 表单进行登录,那么有什么快速简便的方法可以防止流氓客户端用 POST 请求淹没我的 Web 服务器,试图暴力破解我的用户帐户?
PHP/MySQL/Apache。
防止暴力破解比起初看起来要棘手。解决方案是结合控制 - 一个单一的控制不会切芥末。并记住目标:您希望将蛮力攻击减慢到无效的程度,或者您可以检测到它并采取行动。第二种选择通常比第一种更有效。
您可以使用验证码(这是目前流行的技术),但验证码通常可以自动读取,当计算机无法读取它们时,可以通过支付低薪工人或使用验证码来获得人的农场保护“免费”色情(两种技术都已使用)。
其他人在表单中使用秘密值的建议并没有真正的帮助;攻击者只需解析 HTML 即可找到秘密值,并将其包含在他们的帖子中。这很容易自动化,所以它不是一个很好的防御。哦,如果结果证明该值很容易预测(使用不良或损坏的 PRNG 或不良种子),那么您再次陷入困境。
跟踪 IP 地址是可以的,但前提是您不支持 NAT。使用 NAT,有效用户将看起来是重复的。请记住,攻击者可以冒充其他系统;单个攻击系统可以使用其他 IP 地址,甚至可以拦截到该系统的流量(ARP 中毒是一种很好的机制)。
您可以在给定时间段内使用最大失败超时次数(例如 1 小时内 3 次)。这会减慢攻击者的速度,但不一定能阻止他们。您可能包括自动解锁,但您需要做一些数学运算,并确保解锁时间确实有用。
指数退避是另一种有用的机制。这可能会将会话(攻击者不必返回到服务器)与 IP 地址(与 NAT 中断)或帐户(不考虑跨多个帐户的暴力破解)相关联.
要使其他防御措施有用,您必须拥有强密码。如果您的密码很容易猜到(它们在字典中吗?它们是否很短?它们是否复杂?)攻击就会成功。实现最低密码强度要求和“非法密码”字典(结合该字典的常用字符替换)是一个好主意。或者,您可以使用诸如 OATH、证书登录或硬件令牌(如 RSA 的 SecurID)之类的系统。
我认为是 Burt Kaliski 讨论了客户难题。基本上,你给客户端一个对服务器来说很容易但对客户端来说很难的挑战;客户端通过浪费自己的资源尝试解决难题来 DoS 自己。这里的困难在于确定谜题的正确复杂性。例如,它可能会分解大量数字。无论是什么,您都必须假设最有效的算法,并且您必须能够处理不同机器上不同浏览器的不同性能(可能很慢),同时减慢浏览器外部的自动攻击(可能比你的JavaScript)。我有没有提到你必须在 JavaScript 中实现一个解决方案?
但是您仍然会遇到跨多个帐户的攻击。我不知道有任何公开使用的控件可以很好地解决这个问题,除非您可以跟踪 IP 地址。
然后,您需要保护用户名。不知道用户名的攻击者(需要一个不指示用户名何时有效的系统)将必须同时学习用户名和密码,而不是轻松地确认用户名,然后只是攻击密码。
而且您需要注意错误消息和服务器计时也不会泄露(无效)有效密码。
当您处理错误消息时,请确保密码恢复机制不会泄露任何信息。即使在其他方面很好的系统中,密码恢复也会毁掉整个事情。
但是,总而言之,攻击最终取决于服务器的性能。您可以简单地实现一个非常慢的身份验证机制(对于有效和无效的身份验证都必须很慢)。保证在线攻击不会比服务器处理请求的速度快。
然后,您需要检测暴力攻击,因此您的系统需要良好的审计跟踪。但是你需要小心不要记录太多的日志消息,否则你会打开一个简单的方法来通过填充磁盘空间来处理服务器。像 syslog 的“上一条消息已收到 1000 次”这样的消息会很好。
一旦你完成了设计工作,并且当你完成了实现工作,你会想要检查整个系统和系统的所有功能,在给定当前设置和服务器性能的情况下对其进行数学建模并确定攻击者暴力破解(a)单个帐户和(b)任何帐户(跨帐户暴力破解以避免特定于帐户的控制)所需的平均时间。
一种方法是跟踪每个请求的 IP 地址(甚至是 IP 地址的前 3 个八位字节),并增加大量时间来响应(甚至丢弃)来自具有更多请求的 IP 的请求在过去 y 分钟内超过 x 个请求。
这对分布式攻击无效(或效果较差),但对于相对简单的实现来说,效果很好。
为了获得更强大的保护,人们还可以通过在一段时间内系统地拒绝对此类 IP 的访问来将违规 IP(IP 或前 3 个 IP 的前 3 个八位字节,在过去 2 分钟或更短的时间内提交了超过 6 次错误尝试)列入黑名单说15分钟。
好吧,如果您知道登录尝试源的 IP,您可以允许它进行 5 次尝试,然后让该 IP 等待 5 分钟的“冷静”期。如果您认为 5 分钟太短,请将其延长到更合适的时间(可以长达 24 小时,如果您认为有必要,可以更长)。如果他们在僵尸网络中有数十个协调节点,这可能效果不佳。