2

我正在尝试使用 NodeJS 制作一个应用程序,该应用程序在很大程度上取决于用户通过浏览器中的典型 WebSocket 协议连接到它,我在 nodeJS 中为此使用 ws 库。

实际的应用程序工作正常,我可以断开任何用户(如果我可以检测到当前 IP 地址已经连接),并使用用户名和密码授权它(所有在服务器端处理,之后他们通过 websocket 发送用户名和密码,我什至可以在服务器端设置一个计时器,以防止客户端强制服务器尝试使用用户名和密码进行授权);但是,我还没有找到一种方法来阻止连接发生

我的意思是什么?例如,在客户端,某人可以打开他们的 javascript 控制台并简单地输入如下内容:

setInterval(function() {
    new WebSocket("ws://myServerURL")
}, 1)

并简单地让它继续下去,很快整个服务器将完全被封锁和/或因来自同一客户端的大量持续连接而崩溃。

所以,虽然我可以在用户尝试连接后断开连接(例如,如果我检测到它已经连接到同一个 IP 地址),但是我怎样才能阻止某人简单地发送持续连接和/或命令喜欢上面的代码?如何从一开始就完全阻止整个 IP 地址打开任何新连接?

4

2 回答 2

3

有一些 npm 包可以帮助限制速率,但我更愿意将其完全排除在应用服务器之外,因为它们仍然会消耗资源。

在实践中,我使用Nginx作为我们 api 的代理,并将它们配置为限速请求。

以下示例将根据用户的 ip 限制每秒 10 个请求:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

Nginx 易于启动和运行,经过实战测试并且有据可查。

如果使用 Heroku,您可以使用 buildpack 轻松配置它。这是一个演示回购

于 2019-11-17T04:57:51.313 回答
1

如果必须,您可以在您的应用程序中执行此操作,但我建议将您的服务器放在 Nginx(或类似的)后面,并让 Nginx 处理防止这些类型的通用攻击。

https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/

这样,您可以专注于构建您的应用程序,而无需重新发明整个事物。

于 2019-11-17T04:54:41.407 回答