我正在node.js中构建一个应用程序,允许用户使用express和busboy上传文档。用户可以在一次上传中上传多个文档,但限制为总文件大小为20mb。
是否可以阻止用户在给定的时间内发出多个上传请求?我担心的是有人可以轻松编写一个脚本来上传20mb(每次上传的限制)并重复这个100x一分钟或一些大量。让用户每30秒或每分钟上传一次是理想的。
答案 0 :(得分:0)
你可以通过多种方式实现这一点,但我认为对我来说最有意义的方法可能是每个用户有一个总上传限制,或者某个日期字段指示特定用户何时可以上传一组新文件。
如果您可以提供有关堆栈的更多详细信息,我可能会帮助解决一些代码。
答案 1 :(得分:0)
您可以使用中间件进行检查
app.use('/upload', upload-middleware, req-res-func)
upload-middleware
接收req
,通过cookies / session-id /等计算用户并存储上次上传时间。如果当前请求时间和上一个时间匹配,则调用next()
转发请求到req-res-function,然后呼叫next(new Error('Upload error...'))
。答案 2 :(得分:0)
如果您想通过IP进行速率限制,此模块会添加各种配置,包括按路径应用规则的功能(例如您的上传功能):
答案 3 :(得分:0)
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
,Mongo
和Redis
限制器