快速速率限制阻止所有用户的请求

Oma*_*hir 5 rate-limiting amazon-web-services node.js express

我正在使用express-rate-limitnpm 包,我在 AWS 上部署了后端(t2 micro ec2 实例),当限制器打开时,尝试与ALL users我的 API 交互的请求被阻止,它工作了几分钟,停止了大约 10 分钟。当我注释掉限制器部分时,一切都工作正常,我认为只有一个试图用请求攻击服务器的用户应该阻止太多请求,但发生的情况是ALL users get blocked,所有用户都被视为只有 1 个用户,这就是我的结论。

如果是这样的话我该怎么办?我需要打开速率限制器,如果有其他解释会是什么?

kma*_*ana 10

默认情况下,express-rate-limitkeyGenerator一个req.ip。当我将其记录到我的服务器上时,'::ffff:127.0.0.1'显然每个请求都会相同,因此一旦限制一个 IP 地址,就会限制所有 IP 地址。

我的解决方案是使用request-ip获取正确的 IP 地址,如下所示:

const rateLimit = require('express-rate-limit');
const requestIp = require('request-ip');

const app = express();

app.use(requestIp.mw());

app.use(rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 30, // limit each IP to 30 requests per windowMs
  keyGenerator: (req, res) => {
    return req.clientIp // IP address from requestIp.mw(), as opposed to req.ip
  }
}));
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案有效。希望这不会造成任何问题。 (2认同)
  • 这似乎有效,但会让您容易受到恶意用户的攻击,这些用户使用任意不正确的 IP 设置标头。根据反向代理的配置,这些标头可能会到达应用程序,从而允许该恶意用户绕过速率限制。使用express的内置`app.set('trust proxy', 1)`设置更安全一些,因为它只信任最近的代理。(我是express-rate-limit 的作者。) (2认同)