【问题标题】:How to ban a user for 60 seconds after he exceeded rate limit quota, in Fastify. ( fastify-rate-limit )在 Fastify 中,如何在用户超过速率限制配额后将其禁止 60 秒。 ( fastify-rate-limit )
【发布时间】:2021-07-15 07:13:38
【问题描述】:

我的 fastify 速率限制表现异常。 我想在 60 秒内允许 20 次点击,如果您的用户超过限制,那么他们应该再被阻止 60 秒。

这是我的代码 ->

要使用它,您需要执行“ npm install fastify-rate-limit ”

fastify.register(require('fastify-rate-limit'),
{
  keyGenerator (req) { 
    let requestUrl = req.raw.url;
    requestUrl = requestUrl.split('/');
    let apiName = requestUrl[requestUrl.length - 1].replace('/','');
    return req.raw.ip+apiName; 
  },
  max: 20,
  timeWindow: 1000*60,
  addHeaders: { 
    'x-ratelimit-limit': true,
    'x-ratelimit-remaining': true,
    'x-ratelimit-reset': true,
    'retry-after': true
  },
});

我想要实现的场景->

用户 A 在 32 秒内请求 API 20 次,这意味着他现在已经用尽了他的命中配额(因为他只能在 60 秒内进行 20 次命中),如果现在他在剩余的 28 秒内再次请求,他应该在 60 秒内被阻止对该 API 发出请求。

【问题讨论】:

  • 不像你描述的那样工作?
  • 是的,它不起作用,正如我所描述的那样
  • 我错过了你得到的行为:速率限制根本不适用,还是被阻止的请求时间不同?
  • 不同的时间,我有一个 60 秒的时间窗口,在此之前它允许请求。我想要的是在允许的请求之后它应该阻塞 60 秒
  • @ManuelSpigolon 我在这里使用请求的 IP 地址作为密钥的一部分,但是如果 20 个系统连接到同一个 wifi 并且同时访问我的站点,那么它们都会在第一次请求后被阻止,因为它们都有相同的公共 IP 地址,那是集线器/路由器的地址,这是一个问题,你能建议一个更好的方法来唯一地识别这个网络中的系统,这样我就可以为每个系统提供一分钟内 20 次点击的速率限制,而不是一分钟内为整个网络提供 20 次点击的速率限制。?

标签: node.js rate-limiting fastify


【解决方案1】:

如果不实现您自己的customStorage,您将无法归档它。 默认内存实现有一个时钟,当timeWindow 消失时打开。 所以你每 60 秒收到 20 个请求。达到限制后 60 秒不开始计数

此外,我会将keyGenerator 升级为:

return `${req.raw.ip}-${req.routerPath}`

因为该函数可能会被http://localhost/api?a=1http://localhost/api?a=2 等欺骗。因为原始 URL 正在发生变化

【讨论】:

  • 我不确定如何创建自己的 customStorage,但我同意你所说的关于我的 Keygenerator 功能的说法。感谢您指出。
  • 对我来说 req.routerPath 是未定义的。我在调试时检查了它
  • 你有什么fastify版本?
  • fastify 版本为 2.15.1
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2020-09-17
相关资源
最近更新 更多