javascript - 对特定 IP 而非全局应用速率限制登录 api

标签 javascript node.js express brute-force rate-limiting

我正在使用express-rate-limit@2.11.0模块,它工作正常,但它会全局阻止API,而不是因为它受到点击而阻止特定的API。

我的代码:

const limiter = new RateLimit({
        windowMs: 15*60*1000,
        max: 100,
        delayMs: 0,
        message: '==> You have made too many attempts in a short period of time, please try later',
        handler: (req, res) => {
            res.format({
                json: () => {
                    res.status(429).json({
                        message: 'You have made too many attempts in a short period of time, please try later'
                    });
                }
            });
        },
        onLimitReached: (req, res, options) => {
            logger.error(options.message, resolveLogger({
                reqURL: req.url,
                statusCode: options.statusCode
            }));
        }
    });

有人可以建议我如何将其限制为仅针对特定 IP

最佳答案

正如评论中提到的,最好限制反向代理、负载均衡器或 Node.js 应用程序的任何其他入口点的速率

如果这不适合您的应用,我建议 rate-limiter-flexible

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

const opts = {
  points: 100, // 100 points
  duration: 15*60, // Per 15 minutes
};

const rateLimiter = new RateLimiterMemory(opts);

const rateLimiterMiddleware = (req, res, next) => {
  const isIpLimited = isIpLimited(req.ip);
  if (isIpLimited) {
    // Consume 1 point for each request
    rateLimiter.consume(req.ip)
      .then(() => {
        // There was enough remaining points
        next();
      })
      .catch((rejRes) => {
        // All points consumed
        const secs = Math.round(rejRes.msBeforeNext / 1000) || 1;
        res.set('Retry-After', String(secs));
        res.status(429).send('Too Many Requests');
      });
  } else {
    next();
  }
};

app.use(rateLimiterMiddleware);

注意:内存限制器在当前进程内存中工作。还有 Cluster、Redis 和 Mongo 限制器,它们共享状态。

关于javascript - 对特定 IP 而非全局应用速率限制登录 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49569437/

相关文章:

javascript - 在 angular.js 中,我可以在 $eval() 之前过滤一些东西吗?

asp.net - 带有 <asp :checkbox/> 的 Javascript 复选框

javascript - 设置来自 server-Node.js(express)/Asp.net-core 的隐藏文本以从客户端读取它- Angular 2

javascript - 如何在 Node.Js 的 forEach 中使用 Select Query?

node.js - Nodejs 日志级别 : how can I print out the actual level of the log?

javascript - 如何使用express-validator对嵌套对象实现验证

javascript - JQuery 日期选择器无法正常工作

javascript - 这个 dat.gui add 函数中的第三个参数的含义是什么?

node.js - 如何在 Express 中生成 CSRF token ?

javascript - express.js 4 has broken request.on ('data' ) 触发