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