保护 express js 服务器免受暴力破解
Posted
技术标签:
【中文标题】保护 express js 服务器免受暴力破解【英文标题】:Protecting express js server from brute force 【发布时间】:2015-12-16 15:58:09 【问题描述】:我正在使用 nodejs 和 express 编写一个 api,我的应用程序由 openshift 免费计划托管。 我想保护我的路线免受蛮力攻击。例如,如果一个 IP 每秒发送超过 5 个请求,则将其阻止 5 分钟。 :)
【问题讨论】:
这被称为“速率限制”,有很多文章和一些以前的 *** 帖子都写过它。我建议你从已经写好的开始。这是一个:What's a good rate limiting algorithm. @jfriend00 谢谢你的名字,我正在寻找它+从头开始写东西非常酷:) 这是Leaky Bucket Algorithm 的一个很好的参考,这是一种用于速率限制的常用算法。 【参考方案1】:最好限制反向代理、负载均衡器或任何其他 node.js 应用程序入口点的速率。
但是,有时它不符合要求。
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
还有集群或分布式应用程序以及许多其他有用的选项
【讨论】:
【参考方案2】:如果您使用的是Express 框架,那么 NPM 上有几个专用于此的包:
express-rate-limiter express-limiter express-brute这些可用于限制 ip,也可用于其他信息(例如,通过用户名来尝试登录失败)。
【讨论】:
【参考方案3】:没有什么可以阻止您直接在 Node.js/express 中实现这一点,但这种事情通常(而且几乎可以肯定更容易)通过使用 nginx
或 Apache httpd
之类的东西来处理您的流量应用程序。
这有一个额外的好处是允许您完全以非特权用户身份运行应用程序,因为 nginx(或其他)将绑定到端口 80 和 443(需要管理/超级用户/任何权限)而不是您的应用程序。此外,您还可以轻松获得许多其他理想功能,例如静态内容缓存。
nginx 有a module specifically for this:
ngx_http_limit_req_module 模块 (0.7.21) 用于限制每个已定义键的请求处理速率,特别是来自单个 IP 地址的请求的处理速率。
【讨论】:
感谢您的回复。但我想我没有明白你的意思。我正在使用 nodejs,不想使用另一个网络服务器 :) 使用 nginx 作为节点的反向代理是标准做法。以上是关于保护 express js 服务器免受暴力破解的主要内容,如果未能解决你的问题,请参考以下文章