簡體   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