繁体   English   中英

node.js 限制来自用户的请求数

[英]node.js limit number of requests from a user

我正在 node.js 中构建一个应用程序,允许用户使用 express 和 busboy 上传文档。 用户可以一次上传多个文档,但总文件大小限制为 20mb。

是否可以防止用户在给定时间内发出多个上传请求? 我担心有人可以轻松编写一个脚本来上传 20mb(每次上传的限制)并每分钟重复 100 次或大量重复此操作。 让用户每 30 秒或每分钟只能上传一次是理想的。

您可以通过多种方式实现这一点,但我认为对我来说最有意义的方法可能是为每个用户设置一个总上传限制,或者某种日期字段来指示特定用户何时可以上传新的文件集。

如果您可以提供有关您的堆栈的更多详细信息,我可能会帮助编写一些代码。

您可以使用中间件来检查它

  1. app.use('/upload', upload-middleware, req-res-func)
  2. upload-middleware通过 cookie/session-id/etc 接收req ,计算用户并存储上次上传时间。 如果当前请求时间和上一个时间匹配,则调用next()将请求转发到 req-res-function 否则调用next(new Error('Upload error...'))

如果您想通过 IP 进行速率限制,该模块添加了各种配置,包括通过路径应用规则的能力(例如您的上传功能):

https://www.npmjs.com/package/express-rate-limit

我建议使用rate-limiter-flexible

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

const rateLimiter = new RateLimiterMemory(
{
  points: 1,
  duration: 30, // per 30 seconds
});

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

app.use('/upload', rateLimiterMiddleware);

Memory仅适用于当前进程内存。 还有用于集群和分布式应用程序的ClusterMongoRedis限制器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM