Tiredful API限流绕过实战指南:Throttling机制为何防不住批量请求?
【免费下载链接】Tiredful-APIAn intentionally designed broken web application based on REST API.项目地址: https://gitcode.com/gh_mirrors/ti/Tiredful-API
Tiredful API 是一款专为安全教学设计的 REST API 漏洞靶场,它的限流(Throttling)挑战场景能让新手直观看到:限流配置看似合理,为何仍防不住批量请求?本文将用一次"触发 429 + 轻松绕过"的实战,带你理解 Django REST Framework 限流机制的工作原理、常见配置陷阱,以及生产环境应该如何正确配置限流。
一、为什么用 Tiredful API 学限流绕过?
大多数 REST API 教程只讲"怎么加限流",很少讲"限流是怎么被绕过的"。Tiredful API 反其道而行——它是一个故意写得不安全的 Web 应用,内置了限流、越权访问、SQL 注入等多个经典场景,官方场景说明见 trains/templates/trains/index.html。
它的限流挑战目标很明确:
Aim: Force server to respond with HTTP response code 429.(强制服务器返回 HTTP 429)
换句话说:先学会触发限流,再学会批量绕过它。这正是安全测试中最真实的攻击视角。
二、Throttling 机制的工作原理
Tiredful API 基于 Django + Django REST Framework(DRF)构建,限流全局配置在Tiredful_API/settings.py中:
- 匿名用户(anon):10 次/天
- 已登录用户(user):20 次/小时
DRF 的 Throttling 机制本质是:
- 每个请求进入时,根据
throttle scope(如user、anon)查找对应策略; - 计算请求者的"身份标识"(ident),已登录用户是用户 ID,匿名请求通常没有标识或按 IP 处理;
- 在缓存中记录该身份在时间窗口内的请求数,超限则直接返回429 Too Many Requests。
这套逻辑看起来无懈可击,但问题出在"身份标识"这一步。
三、漏洞所在:UserRateThrottle 只管"登录用户"
查看火车票务接口trains/views.py的限流装饰器:
@throttle_classes([UserRateThrottle]) def get_status(request):注意它用的是UserRateThrottle——它只对"已认证用户"计数。这带来两个典型陷阱:
- 🎯匿名请求不计入限制:没有登录态的请求拿不到用户标识,限流器直接放行,批量脚本可以无限制地调用;
- 🎯限流只挂在单一接口:其他接口(如
library/views.py、exams/views.py)完全没有 throttle 装饰器,限流成了"选择性设防"。
所以答案呼之欲出:批量请求只要避开"已登录用户"这个计数身份,Throttling 机制就形同虚设。
四、实战:触发 429,再批量绕过
整个实验在本地跑一遍即可,仓库克隆地址:https://gitcode.com/gh_mirrors/ti/Tiredful-API,克隆后执行python manage.py runserver启动服务。
第 1 步:登录并触发限流
用普通用户身份连续调用POST /api/v1/trains/(挑战页会给出可用的 PNR 号)。按 20 次/小时的配置,短时间连续发送 21 个请求后,第 21 个请求收到HTTP 429——限流"生效"了。
第 2 步:批量绕过
- 方式 A:匿名轰炸—— 去掉登录态(不带 Token),用简单循环对接口发起数百次匿名请求,全部返回 200,限流计数纹丝不动;
- 方式 B:多账号轮换—— 注册/切换多个用户身份,每个身份都吃不满配额,聚合起来的请求量远超单用户限制。
两种方式都验证了同一件事:只按用户身份计数的限流,挡不住匿名流量和多账号批量请求。
五、如何正确配置 API 限流?
从靶场案例出发,生产环境的限流应满足以下清单:
| 配置要点 | 说明 |
|---|---|
| ✅ 匿名也要限流 | 使用AnonRateThrottle或自定义按 IP 计数的策略,堵住匿名批量请求 |
| ✅ 按接口分级限流 | 敏感接口单独设置更严格的 scope,避免"只挂一个接口" |
| ✅ 全局限流兜底 | DEFAULT_THROTTLE_CLASSES中启用全局默认策略 |
| ✅ 使用共享缓存 | 多实例部署时限流计数要落到 Redis 等共享缓存,否则各节点各算各的 |
| ✅ 监控 429 日志 | 频繁出现 429 或大量匿名高频请求时应告警 |
限流的本质不是"防住"攻击,而是把攻击成本抬高到无利可图。只要留下"匿名不计费"这类缺口,攻击者总会批量走那条路。
六、小结
- Tiredful API 的限流场景证明:Throttling 机制防住的是"登录用户的手速",防不住"批量匿名请求";
- 根源在于
UserRateThrottle只统计已认证身份,且限流装饰器未覆盖全部接口; - 新手做 API 安全自查时,记住口诀:匿名要限、接口要全、缓存要共享、日志要监控。
动手触发一次 429、再绕过它,你对 API 限流的理解会超过十篇文档。这个靶场正是为此而生。
【免费下载链接】Tiredful-APIAn intentionally designed broken web application based on REST API.项目地址: https://gitcode.com/gh_mirrors/ti/Tiredful-API
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考