节点 js 速率限制
Node js Rate Limit
我正在尝试使用 express-rate-limit 在我的应用程序上设置 API 速率限制。如果它来自相同的 IP 地址,它就可以工作。一旦达到最大值 5,我就会收到一条错误消息。但是,当从不同的 IP address/computer 尝试时,它会失败。知道我该如何解决这个问题吗?我尝试使用 127.0.0.1 来生成一个密钥,不管是哪个 IP 地址,但也失败了。
下面是我的代码:
// Rate Limit
var RateLimit = require('express-rate-limit');
app.enable('trust proxy');
var limiter = new RateLimit({
windowMs: 365*24*60*60*1000, // 1 year
max: 5, // limit each IP to 1 requests per windowMs
delayMs: 365*24*60*60*1000, // delaying - 365 days until the max limit is reached
message: "Sorry, the maximum limit of 50 letters sent has been reached. Thank you for participating!",
keyGenerator: function (req) {
req.ip = "127.0.0.1";
// req.ip = "ip address";
return req.ip;
}
});
app.use('/api/letter', limiter);
express-rate-limit
使用的内存存储实现使用 setTimeout()
在 windowMs
毫秒后清除存储。
根据 Node.js documentation for setTimeout()
,
When delay is larger than 2147483647 or less than 1, the delay will be set to 1.
在您的情况下,延迟大于该数量,即 31536000000 毫秒。这导致存储永远不会存储超过 1 毫秒的任何数据。
要解决这个问题,您可能必须实现自己的商店(请参阅 store
选项),或者寻找没有此限制的替代速率限制器(在我看来如此长的到期时间,无论如何你都需要某种持久存储)。
我觉得叫这个"rate limiting"是完全合理的。仅仅因为时间段很大(每年)并不意味着它不是每个时间段的限制。
https://www.ratelim.it/documentation/once_and_only_once 更进一步,让你每个 "infinite" 做 N 次,这非常有用。
您应该可以使用这项服务每年做 5 次。 (我运行ratelim.it)。
rate-limiter-flexible 包含 Mongo 的软件包可以帮助设置 1 年的速率限制
const { RateLimiterMongo } = require('rate-limiter-flexible');
const { MongoClient } = require('mongodb');
const mongoOpts = {
useNewUrlParser: true,
reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
reconnectInterval: 100, // Reconnect every 100ms
};
const mongoConn = MongoClient.connect(
'mongodb://localhost:27017',
mongoOpts
);
const opts = {
mongo: mongoConn,
points: 5, // Number of points
duration: 365*24*60*60, // Per 1 year
};
const rateLimiter = new RateLimiterMongo(opts);
app.use('/api/letter', (req, res, next) => {
rateLimiter.consume(req.ip)
.then(() => {
next();
})
.catch((rejRes) => {
res.status(429).send('Too Many Requests');
});
);
还建议设置insuranceLimiter
和屏蔽策略。阅读更多 here
我正在尝试使用 express-rate-limit 在我的应用程序上设置 API 速率限制。如果它来自相同的 IP 地址,它就可以工作。一旦达到最大值 5,我就会收到一条错误消息。但是,当从不同的 IP address/computer 尝试时,它会失败。知道我该如何解决这个问题吗?我尝试使用 127.0.0.1 来生成一个密钥,不管是哪个 IP 地址,但也失败了。
下面是我的代码:
// Rate Limit
var RateLimit = require('express-rate-limit');
app.enable('trust proxy');
var limiter = new RateLimit({
windowMs: 365*24*60*60*1000, // 1 year
max: 5, // limit each IP to 1 requests per windowMs
delayMs: 365*24*60*60*1000, // delaying - 365 days until the max limit is reached
message: "Sorry, the maximum limit of 50 letters sent has been reached. Thank you for participating!",
keyGenerator: function (req) {
req.ip = "127.0.0.1";
// req.ip = "ip address";
return req.ip;
}
});
app.use('/api/letter', limiter);
express-rate-limit
使用的内存存储实现使用 setTimeout()
在 windowMs
毫秒后清除存储。
根据 Node.js documentation for setTimeout()
,
When delay is larger than 2147483647 or less than 1, the delay will be set to 1.
在您的情况下,延迟大于该数量,即 31536000000 毫秒。这导致存储永远不会存储超过 1 毫秒的任何数据。
要解决这个问题,您可能必须实现自己的商店(请参阅 store
选项),或者寻找没有此限制的替代速率限制器(在我看来如此长的到期时间,无论如何你都需要某种持久存储)。
我觉得叫这个"rate limiting"是完全合理的。仅仅因为时间段很大(每年)并不意味着它不是每个时间段的限制。
https://www.ratelim.it/documentation/once_and_only_once 更进一步,让你每个 "infinite" 做 N 次,这非常有用。
您应该可以使用这项服务每年做 5 次。 (我运行ratelim.it)。
rate-limiter-flexible 包含 Mongo 的软件包可以帮助设置 1 年的速率限制
const { RateLimiterMongo } = require('rate-limiter-flexible');
const { MongoClient } = require('mongodb');
const mongoOpts = {
useNewUrlParser: true,
reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
reconnectInterval: 100, // Reconnect every 100ms
};
const mongoConn = MongoClient.connect(
'mongodb://localhost:27017',
mongoOpts
);
const opts = {
mongo: mongoConn,
points: 5, // Number of points
duration: 365*24*60*60, // Per 1 year
};
const rateLimiter = new RateLimiterMongo(opts);
app.use('/api/letter', (req, res, next) => {
rateLimiter.consume(req.ip)
.then(() => {
next();
})
.catch((rejRes) => {
res.status(429).send('Too Many Requests');
});
);
还建议设置insuranceLimiter
和屏蔽策略。阅读更多 here