我在我的网站上创建了一个登录模块。我能够处理简单的暴力攻击,因为我可以根据用户名/电子邮件识别用户,并根据每个用户帐户的失败登录尝试限制他们的登录。
但是当涉及到用户枚举的暴力攻击(又名反向暴力攻击)时,识别用户变得非常困难。根据每个 IP 地址的失败尝试限制登录可能效果不佳,并且会惹恼通过本地网络连接到 Internet 的用户,因为他们将拥有相同的外部 IP 地址,因为他们可能会由于其他人尝试失败而面临限制网络。
有没有办法唯一识别这些用户?
我在我的网站上创建了一个登录模块。我能够处理简单的暴力攻击,因为我可以根据用户名/电子邮件识别用户,并根据每个用户帐户的失败登录尝试限制他们的登录。
但是当涉及到用户枚举的暴力攻击(又名反向暴力攻击)时,识别用户变得非常困难。根据每个 IP 地址的失败尝试限制登录可能效果不佳,并且会惹恼通过本地网络连接到 Internet 的用户,因为他们将拥有相同的外部 IP 地址,因为他们可能会由于其他人尝试失败而面临限制网络。
有没有办法唯一识别这些用户?
如何唯一标识具有相同外部 IP 地址的用户?有没有办法唯一识别这些用户?
是的,有很多方法:
但其中大多数在防御暴力攻击方面没有用,因为执行它们的程序可能不会接受 cookie 或运行 JavaScript。
在您的情况下,您可以尝试:
您甚至可以通过使用 HTML5 和WebRTC从 Internet 获取用户的内部 IP 地址。您可以查看文章使用 HTML5 WebRTC 发现本地 IP:安全和隐私风险?欲了解更多信息并在http://net.ipcalf.com/上试用。
提供该文章的网站现在似乎已关闭。但是,我认为这篇文章WebRTC Found Leaking Local IP Adresses也可以提供一些信息。
据我所知,没有一种不可欺骗的方法。如果您已经将最大尝试次数限制为每分钟 8 次尝试,并且超时一分钟。只要您向用户提供足够的信息,一分钟的超时通常不会被认为是烦人的。
确保积极审查这些疑似来自 IP 地址的暴力破解的事件,因为调查谁试图暴力破解您可能会很有趣。
这里提到的大多数其他方法很容易被击败和/或显着降低性能。
这就是 Web 应用程序防火墙 (WAF) 不依赖它们的原因。
2个可靠的方法是:
如果您将解决方案与速率限制相结合,正确的速率限制应该是每页 URL 数量的 1-2 倍。例如,如果 login.php 包含 2 个 CSS 文件、4 个 JavaScript 文件和 10 个图像以及 1 个页面本身,则您必须允许每个客户端会话 cookie 每秒至少有 17 次点击。否则,您可能会阻止/限制正常请求。
对于持续性攻击,您应该要求您的 ISP 阻止/黑洞上游路由。
为什么不使用其他解决方案?
'User-Agent:' 很容易被欺骗:
wget -O index.html --user-agent="My Fake Browser"
会话 cookie、“X-Forwarded-For:”HTTP 标头和其他标头也很容易被窃取/欺骗。Google 'Firesheep' 或 'Cookies Manager+' 或 'Modify Headers plugin' 或 'LiveHeaders plugin' 等以作证明。
单独的速率限制也是不够的,因为隐形攻击会随机化或增加请求之间的等待时间:
wget --limit-rate=10 http://example.com/index.php
蛮力通常不是你唯一的问题。 https://www.owasp.org/index.php/Top_10_2013-Top_10编码和测试有效的保护也需要时间。为了节省您的 Web 服务器上的时间和/或 CPU 周期——如果您有一个服务器场,这将成倍增加浪费——您的 Web 主机应该提供一个为您配置的前端 WAF。这是最好的解决方案——不要在服务器端做。在上游做。