保护快递js服务器免受暴力破坏

Ame*_*avi 0 api brute-force node.js express

我正在使用nodejs和express编写api,我的应用程序由openshift免费计划托管.我想保护我的路线免受蛮力.例如,如果IP发送超过5个请求/秒,则将其阻止5分钟.:)

Tro*_*ott 7

没有什么可以阻止你直接在Node.js/express中实现它,但是通过使用像nginxApache 这样的东西httpd来处理你应用程序的流量,这种事情通常(并且几乎肯定更容易)处理.

这有一个额外的好处,允许您完全作为非特权用户运行应用程序,因为nginx(或其他)将绑定到端口80和443(这需要管理/超级用户/任何权限)而不是您的应用程序.此外,您还可以轻松获得一系列其他理想的功能,例如缓存静态内容.

nginx有一个专门用于此的模块:

ngx_http_limit_req_module模块(0.7.21)用于限制每个定义密钥的请求处理速率,特别是来自单个IP地址的请求的处理速率.

  • 使用nginx作为节点的反向代理是标准做法. (5认同)

jza*_*ruk 5

如果您使用Express框架,NPM 上有几个专门用于此的包:

这些可用于通过 ip 进行限制,但也可用于其他信息(例如,登录尝试失败的用户名)。


Ani*_*mir 5

最好限制反向代理、负载均衡器或 node.js 应用程序的任何其他入口点的速率。

但是,它有时不符合要求。

rate-limiter-flexible包有你需要的块选项

const { RateLimiterMemory } = require('rate-limiter-flexible');

const opts = {
  points: 5, // 5 points
  duration: 1, // Per second
  blockDuration: 300, // block for 5 minutes if more than points consumed 
};

const rateLimiter = new RateLimiterMemory(opts);

const rateLimiterMiddleware = (req, res, next) => {
  // Consume 1 point for each request
  rateLimiter.consume(req.connection.remoteAddress)
    .then(() => {
      next();
    })
    .catch((rejRes) => {
      res.status(429).send('Too Many Requests');
    });
};

app.use(rateLimiterMiddleware);
Run Code Online (Sandbox Code Playgroud)

您可以配置rate-limiter-flexible任何确切的路由。请参阅有关使用中间件的官方快速文档

还有用于集群或分布式应用程序的选项以及许多其他有用的选项