[我正在尝试使用NodeJS创建一个应用程序,该应用程序在很大程度上取决于用户通过典型的WebSocket协议从其浏览器连接到该应用程序,而我正在nodeJS中使用ws库。
实际的应用程序运行正常,并且我可以断开任何用户的连接(如果我可以检测到当前IP地址已经连接),并使用用户名和密码对其进行授权(所有操作均在服务器端进行, ,他们在通过网络套接字发送了用户名和密码后,甚至可以在服务器端设置一个计时器,以防止客户端强行迫使服务器尝试使用用户名和密码对自己进行授权);但是,我还没有找到一种方法来阻止在first位置发生的连接。
我是什么意思?例如,某人可以在客户端打开其JavaScript控制台,只需键入以下内容:
setInterval(function() {
new WebSocket("ws://myServerURL")
}, 1)
并且简单地让它继续进行,很快整个服务器将被来自同一客户端的大量恒定连接完全阻塞和/或崩溃。
因此,尽管尝试连接用户后,我能够断开连接(例如,如果我检测到它已经连接到相同的IP地址),但是如何阻止某人简单地发送信息常量连接和/或以上代码的命令?从一开始,如何完全阻止整个IP地址打开任何新连接?
有npm软件包可帮助限制速率,但我更喜欢将其完全排除在应用服务器之外,因为它们仍会消耗资源。
我练习将Nginx用作我们api的代理,并将其配置为rate-limit请求。
以下示例将基于用户的ip每秒限制10个请求:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
Nginx易于安装,运行,经过战斗测试并有据可查。
[如果使用Heroku,您可以使用buildpack轻松配置它。这是要查看的demo repo。
如果需要,可以在您的应用程序上执行此操作,但是我建议将您的服务器放在Nginx(或类似的产品)后面,并让Nginx处理以防止此类通用攻击。
https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/
这样,您可以专注于构建应用程序而不必重新发明整个过程。