3

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

是否可以防止用户在给定时间内发出多个上传请求?我担心有人可以很容易地编写一个脚本来上传 20mb(每次上传的限制),然后每分钟重复 100 次或大量。最好让用户每 30 秒或每分钟只能上传一次。

4

4 回答 4

2

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

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

于 2017-01-06T23:36:09.413 回答
2

我建议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仅在当前进程内存中工作。还有集群和分布式应用程序的Cluster,MongoRedis限制器

于 2018-06-10T05:59:10.853 回答
1

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

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

于 2016-07-14T22:41:25.933 回答
0

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

  1. app.use('/upload', upload-middleware, req-res-func)
  2. upload-middleware通过 cookies/session-id/etc接收req、计算用户并存储上次上传时间。如果当前请求时间和上一个时间匹配,则调用next()将请求转发到 req-res-function else call next(new Error('Upload error...'))
于 2016-07-15T04:15:49.270 回答