用途
该技能用于为 API 端点添加按用户和按 IP 的速率限制,防止来自被盗账号、机器人或恶意行为者的滥用。它对应 OWASP A04(不安全设计)和 A07(认证失败)两类风险。
为什么速率限制重要
资料指出,没有速率限制时会出现以下问题:
- 被盗的会话令牌可以在几秒内耗尽所有额度
- 机器人可以创建数千张支付发票
- 单个用户即可对服务发起 DoS
- 针对认证端点的暴力破解攻击会成功
主要能力
技能覆盖多种技术栈的限流实现:
- Cloudflare Workers(基于 KV 的滑动窗口):提供
checkRateLimit工具函数,按用户 ID、端点与时间窗口生成 KV 键,统计请求数,超限时记录审计日志并返回retryAfterSeconds。 - Express.js / Node.js:给出使用
express-rate-limit的中间件示例,以及使用rate-limiter-flexible配合 Redis 的生产级方案。 - Next.js(App Router):提供基于中间件的限流示例,并注明内存限流仅适用于单实例部署,无服务器/边缘环境应使用 KV、Redis 或 Cloudflare 限流规则。
- Cloudflare 仪表盘限流规则:无需改代码即可配置基于 IP 的限流。
推荐限流阈值
资料给出以下推荐值:
- 额度消耗 / 导出:10 次/分钟,窗口 60 秒
- 创建支付:5 次/分钟,窗口 60 秒
- 登录尝试:5 次/分钟,窗口 60 秒
- 密码重置:3 次/小时,窗口 3600 秒
- API 通用:60 次/分钟,窗口 60 秒
- 访客 / 匿名:1 次/天,窗口 86400 秒
使用方式
- 在 Cloudflare Workers 中引入
checkRateLimit,在 API 路由中调用并传入 KV 命名空间、用户 ID、端点标识、最大请求数与窗口秒数;超限时返回 429 状态码与Retry-After头。 - 在 Express 中使用
express-rate-limit或rate-limiter-flexible创建限流中间件,以用户 ID 或 IP 作为键。 - 在 Next.js 中通过
middleware.ts对/api/路径进行限流。 - 在 Cloudflare 仪表盘创建限流规则:匹配 URI 路径包含
/api/,速率 100 次/分钟,按 IP 地址,动作是封禁 60 秒。
响应头
资料建议始终包含标准限流响应头:Retry-After、X-RateLimit-Limit、X-RateLimit-Remaining、X-RateLimit-Reset。
测试
资料提供了一个测试示例:连续发起达到上限的请求应返回 200,下一次请求应返回 429,且响应体包含 rate_limit_exceeded 错误与 retryAfter 字段。
适用场景
适用于需要防止 API 滥用、暴力破解、资源耗尽或自动化攻击的 Web 服务,尤其是使用 Cloudflare Workers、Express.js 或 Next.js 构建的 API。
限制
资料明确指出,内存限流仅适用于单实例部署;无服务器或边缘环境应使用 KV、Redis 或 Cloudflare 限流规则。此外,Cloudflare 仪表盘规则可作为基线防御,即使应用层限流存在缺陷也能提供保护。
PDPA 2024 相关性
资料认为速率限制体现了:相称的安全措施、数据最小化、事件预防。没有速率限制而被暴力破解的系统,在 PDPA 2024 下可被视为疏忽的证据。