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

时间:2015-09-19 15:34:08

标签: node.js api express brute-force

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

3 个答案:

答案 0 :(得分:7)

没有什么可以阻止你直接在Node.js / express中实现它,但是通过使用类似nginx或Apache {{{{}}来处理这类事情通常(并且几乎肯定更容易) 1}}来处理您应用的流量。

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

nginx有a module specifically for this

  

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

最好将反向代理,负载均衡器或任何其他入口点的费率限制在node.js app。

然而,它有时并不符合要求。

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);

您可以为任何确切的路线配置rate-limiter-flexible。见official express docs about using middlwares

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