本文档介绍了如何通过速率限制机制来保护 Node.js 应用程序免受过多流量和潜在的分布式拒绝服务 (DDoS) 攻击。速率限制限制了客户端在特定时间范围内可以发出的请求数量,从而防止了可能导致应用程序无响应的资源耗尽。
来源: sections/security/limitrequests.md3-5
速率限制是一种关键的防御机制,可以保护您的应用程序免受过多并发请求的压垮。这种保护对于 Node.js 应用程序尤其重要,因为它们运行在单线程事件循环上,可能被过多的处理请求阻塞。
速率限制具有多种重要的安全和稳定性目的
来源: sections/security/limitrequests.md59-62
速率限制流程图
来源: sections/security/limitrequests.md5-6
对于 Node.js 应用程序的速率限制实现,有几种方法,每种方法都有不同的特性,适用于各种部署场景。
| 方法 | 优点 | 缺点 | 最佳用途 |
|---|---|---|---|
| 外部服务(nginx) | 减少应用程序开销,专用于此任务 | 需要额外的基础设施 | 生产部署 |
| 应用程序中间件 | 设置简单,直接访问请求上下文 | 消耗应用程序资源 | 小型到中型应用程序 |
| Redis 支持的速率限制器 | 跨多个实例扩展,跨重启持久化 | 需要 Redis 基础设施 | 分布式应用程序 |
来源: sections/security/limitrequests.md5-6
速率限制组件图
来源: sections/security/limitrequests.md7-39
`rate-limiter-flexible` 包为纯 Node.js 应用程序中的速率限制提供了一种灵活的方式。它可以与各种存储后端(包括 Redis)一起使用,以维护速率限制状态。
关键配置选项
points:在持续时间内允许的最大请求数duration:时间窗口(秒)blockDuration:超过限制后阻止请求的时间(秒)实施示例: sections/security/limitrequests.md9-37
该实施创建了一个基于 Redis 的速率限制器,允许每秒 20 个请求。当超过限制时,它会返回 429 状态码,表示“请求过多”。
来源: sections/security/limitrequests.md7-39
对于 Express 应用程序,`express-rate-limit` 中间件提供了一种简单的方法来对特定路由或全局实施速率限制。
关键配置选项
windowMs:时间窗口(毫秒)max:每个窗口允许的最大请求数trust proxy:如果您的应用程序位于代理后面,这是一个重要的设置实施示例: sections/security/limitrequests.md41-57
此示例创建了一个速率限制器,将对 `/user/` 路由的请求限制为每 15 分钟 100 次。
来源: sections/security/limitrequests.md41-57
分级速率限制图
对于运行在多个实例上的应用程序,使用像 Redis 这样的集中式存储来进行速率限制状态至关重要,以确保所有实例之间速率限制的一致性。
分布式速率限制图
速率限制应作为更广泛的 DDoS 攻击防护策略的一部分。其他补充措施包括
| 向量 | 描述 | 防护策略 |
|---|---|---|
| HTTP 洪水 | 用看起来合法的 HTTP 请求压垮服务器 | 每个 IP 的速率限制,行为分析 |
| 慢速 HTTP 攻击 | 故意缓慢地发送 HTTP 请求 | 请求超时,连接限制 |
| RegEx DoS | 导致过度 CPU 使用的恶意 RegEx | 避免易受攻击的 RegEx 模式,使用经过验证的库 |
| CPU/内存耗尽 | 消耗过多资源的请求 | 速率限制,资源配额 |
来源: sections/security/regex.md1-6
X-RateLimit-Limit、X-RateLimit-Remaining 和 Retry-After 等标头虽然应用程序级别的速率限制是有效的,但当出现以下情况时,请考虑使用 Nginx 或云提供商解决方案等专用外部服务
速率限制是 Node.js 应用程序必不可少的安全措施,用于防止资源耗尽和 DDoS 攻击。通过实施适当的速率限制策略,您可以保护您的应用程序,同时确保合法用户能够持续访问您的服务。
请记住,速率限制应作为更广泛安全策略的一部分,其中包括此 wiki 中记录的其他实践,例如输入验证、错误处理和安全编码实践。