我的目标是在 10 分钟内停工前 10 个轮胎。如果用户再次尝试并再次失败 5 次,则锁定时间将增加到 20 分钟。 20 分钟后,如果同一用户尝试 3 次失败,锁定时间为 1 小时,最后,1 小时后,如果同一用户再次出错,则会将其锁定 24 小时。
我怎么能这么做呢?我正在使用
express-rate-limit
并将其作为中间件传递
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 10 * 60 * 1000,
headers: true,
max: 10,
});
module.exports = apiLimiter;
第一次尝试有效,但要进行下一次尝试。
这可以通过创建多个 Express-rate-limit 实例并将它们全部应用于每个请求来完成:
const rateLimit = require('express-rate-limit');
app.post('/login',
// 10 tires in 10 minutes
rateLimit({
windowMs: 10 * 60 * 1000,
headers: false,
max: 10,
}),
// 5 more try in 20 minutes
rateLimit({
windowMs: 20 * 60 * 1000,
headers: false,
max: 10 + 5,
}),
// 3 more tries in 1 hour
rateLimit({
windowMs: 60 * 60 * 1000,
headers: false,
max: 10 + 5 + 3,
}),
// 1 more try in 24 hours
rateLimit({
windowMs: 24 * 60 * 60 * 1000,
headers: false,
max: 10 + 5 + 3 + 1,
}),
function(req, res) {
// handle login attempt here, if it passed all the rate limiters
}
);
在这种情况下,正确处理标头可能很棘手,因此我选择在示例中禁用它们。
重要提示:如果您使用除内置默认内存存储之外的任何
store
,请务必为每个限制创建一个新实例,并为每个存储实例使用唯一的 prefix
。
披露:我是express-rate-limit的作者