我正在使用nodejs和express编写api,我的应用程序由openshift免费计划托管。 我想保护我的路线免受蛮力。例如,如果IP发送超过5个请求/秒,则将其阻止5分钟。 :)
答案 0 :(得分:7)
没有什么可以阻止你直接在Node.js / express中实现它,但是通过使用类似nginx
或Apache {{{{}}来处理这类事情通常(并且几乎肯定更容易) 1}}来处理您应用的流量。
这有一个额外的好处,允许您完全以非特权用户身份运行应用程序,因为nginx(或其他)将绑定到端口80和443(需要管理/超级用户/任何权限),而不是您的应用程序。此外,您还可以轻松获得一系列其他理想的功能,例如缓存静态内容。
nginx有a module specifically for this:
ngx_http_limit_req_module模块(0.7.21)用于限制每个定义密钥的请求处理速率,特别是来自单个IP地址的请求的处理速率。
答案 1 :(得分:2)
如果您使用Express框架,NPM上有几个专门用于此的软件包:
这些可用于通过ip进行限制,也可用于其他信息(例如,通过登录尝试失败的用户名)。
答案 2 :(得分:1)
最好将反向代理,负载均衡器或任何其他入口点的费率限制在node.js app。
然而,它有时并不符合要求。
rate-limiter-flexible包有你需要的阻止选项
const { RateLimiterMemory } = require('rate-limiter-flexible');
const opts = {
points: 5, // 5 points
duration: 1, // Per second
blockDuration: 300, // block for 5 minutes if more than points consumed
};
const rateLimiter = new RateLimiterMemory(opts);
const rateLimiterMiddleware = (req, res, next) => {
// Consume 1 point for each request
rateLimiter.consume(req.connection.remoteAddress)
.then(() => {
next();
})
.catch((rejRes) => {
res.status(429).send('Too Many Requests');
});
};
app.use(rateLimiterMiddleware);
您可以为任何确切的路线配置rate-limiter-flexible
。见official express docs about using middlwares
还有群集或分布式应用程序的选项以及许多其他有用的选项