Web 防止大量登录请求的简单方法?

Web 防止大量登录请求的简单方法?,web,login-attempts,Web,Login Attempts,如果我的网站使用POST表单进行登录,那么有什么简单快捷的方法可以防止恶意客户端向我的web服务器发送POST请求,试图强行破解我的用户帐户 PHP/MySQL/Apache。如果您知道登录尝试源的IP,您可以允许它尝试5次,然后让该IP等待5分钟的“冷却”时间。如果你认为5分钟太短,提高到更合适的时间(可以高达24小时,如果你认为有必要的话,可以延长)。如果僵尸网络中有几十个协调的节点,这可能不起作用。一种方法是跟踪每个请求的IP地址(甚至IP地址的前3个八位字节),并在响应(甚至丢弃)时增加

如果我的网站使用POST表单进行登录,那么有什么简单快捷的方法可以防止恶意客户端向我的web服务器发送POST请求,试图强行破解我的用户帐户


PHP/MySQL/Apache。

如果您知道登录尝试源的IP,您可以允许它尝试5次,然后让该IP等待5分钟的“冷却”时间。如果你认为5分钟太短,提高到更合适的时间(可以高达24小时,如果你认为有必要的话,可以延长)。如果僵尸网络中有几十个协调的节点,这可能不起作用。

一种方法是跟踪每个请求的IP地址(甚至IP地址的前3个八位字节),并在响应(甚至丢弃)时增加一段重要的时间来自IP的请求在过去y分钟内有超过x个请求

这对于分布式攻击是无效的(或不太有效),但对于相对简单的实现来说,在其他方面效果相当好


为了加强保护,还可以通过系统性地拒绝访问此类IP(比如15分钟)来将违规IP(IP,或者IP的前3个八位字节,在过去2分钟或更短时间内提交了6次以上的恶意尝试)列入黑名单。

防止暴力破解比乍看起来更为棘手。解决方案是将控制组合在一起-一个单一的控制将不会削减芥末。记住目标:你想把暴力攻击的速度减慢到要么无效,要么你可以发现它并采取行动的程度。第二种选择通常比第一种更有效

您可以使用验证码(这是目前流行的技术),但验证码通常可以自动读取,当计算机无法读取时,可以通过支付低工资工人或使用验证码保护“免费”色情(这两种技术都已使用)来获取大量的人

其他人建议在表单中使用秘密值并没有真正的帮助;攻击者只需解析HTML即可找到秘密值,并将其包含在帖子中。这是非常简单的自动化,所以它不是一个很好的防御。哦,如果这个值很容易预测(使用一个差的或坏的PRNG或一个坏的种子),那么你又一次陷入困境了

跟踪IP地址是可以的,但前提是您不支持NAT。使用NAT,有效用户将显示为重复用户。记住,攻击者可以模拟其他系统;单个攻击系统可以使用其他IP地址,甚至拦截到该系统的流量(ARP中毒是一种很好的机制)

您可以在给定的时间段内使用最多失败超时次数(如1小时内3次)。这会减慢攻击者的速度,但不一定能阻止他们。您可能会包括一个自动解锁,但您需要做一些计算,并确保解锁时间实际上是有用的

指数退避是另一种有用的机制。这可能与会话(攻击者不必返回服务器)、IP地址(与NAT中断)或帐户(不考虑跨多个帐户的暴力强制)有关

为了让其他防御措施发挥作用,您必须拥有强大的密码。如果您的密码很容易猜到(它们在字典中吗?它们短吗?它们复杂吗?),攻击就会成功。最好实现最低密码强度要求和“非法密码”字典(结合该字典的公共字符替换)。或者,您可以使用诸如宣誓、证书登录或硬件令牌(如RSA的SecurID)之类的系统

我想是伯特·卡利斯基讨论了客户难题。基本上,您给客户机的挑战对服务器来说是容易的,但对客户机来说是困难的;客户为了解决这个难题而浪费自己的资源。这里的困难在于确定谜题的正确复杂性。例如,它可能会分解一个大的数字。不管是什么,您都必须采用最有效的算法,并且必须能够在不同的机器上处理不同浏览器的不同性能(可能较慢),同时减缓浏览器之外的自动攻击(可能快于javascript)。我提到过你必须用JavaScript实现一个解决方案吗

但您仍然会遇到跨多个帐户的攻击。我不知道有任何公开使用的控件可以很好地解决这个问题,除非您可以跟踪IP地址

然后,您需要保护用户名。不知道用户名的攻击者(需要一个不指示用户名何时有效的系统)必须同时了解用户名和密码,而不是轻易确认用户名,然后只攻击密码

您还需要注意,错误消息和服务器计时也不会泄露有效密码

在处理错误消息时,请确保密码恢复机制不会泄露任何信息。即使在其他方面很好的系统中,密码恢复也可能会毁掉整个系统

但是,尽管如此,攻击最终取决于服务器的性能。您可以简单地实现一个非常慢的身份验证机制(对于有效和无效的身份验证都必须很慢)。保证在线攻击的速度不会超过服务器处理请求的速度

然后,您需要检测暴力攻击,因此您的系统需要良好的审计跟踪。但是,您需要注意不要记录太多的日志消息,否则会通过填充磁盘空间打开一种简单的方法来关闭服务器。类似于syslog的“上一条消息已被接收1000次”的消息会很好

一旦你