问题描述
我正在使用express-rate-limit
npm软件包,将后端部署在AWS(t2 micro ec2实例)上,同时启用了限制器,阻止了ALL users
尝试与我的API进行交互的请求,它可以工作几分钟,然后停止约10分钟。
当我注释掉限制器部分时,一切正常,我认为对于只有一个试图用请求锤击服务器的用户,应该阻止太多请求,但是发生的情况是ALL users get blocked
,所有用户都被视为仅一个用户,这就是我的结论。
如果是这种情况,我该怎么办?,我需要开启我的限速器,并且如果还有其他解释,那会是什么?
解决方法
默认情况下,express-rate-limit
的 keyGenerator
为 req.ip
。当我在我的服务器上记录它时,它是 '::ffff:127.0.0.1'
,这显然对于每个请求都是相同的,因此一旦限制为一个,就会限制所有 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
}
}));
,
express-rate-limit
软件包根据IP地址阻止请求,这是因为它为速率限制提供了非常基本的配置,适用于大多数应用程序。如果您基于用户进行阻止,则有人可以轻松地配置漫游器以攻击您的API,直到达到一个用户帐户的限制,然后自动创建一个新帐户以再次开始攻击您的服务器。基于IP的阻塞避免了这样的风险,因为无论有多少用户从该IP请求,一个IP都意味着一个设备。在大多数情况下,一个人最有可能使用一台设备,因此此解决方案效果很好。