你的 API 对大负载返回 400?恭喜,你刚刚构建了一个礼貌的 DoS 网关
Source: Dev.to
返回 400 处理超大负载的问题
当客户端发送巨大的请求体时,许多 API 会返回:
400 Bad Request
这个响应具有误导性。超大负载应该使用 413 Payload Too Large 拒绝,这会明确告知客户端请求大小超出了服务器的限制。返回 400 暗示的是数据本身有问题,而不是大小问题。
错误状态码的后果
如果服务器在已经开始处理请求后返回 400,可能已经:
- 消耗了 CPU 和内存资源
- 打开了数据库连接
- 执行了其他昂贵的操作
当多个并发的超大请求到达时,累计效应会把一个简单的验证问题转变为拒绝服务(DoS)场景。
Rentgen 中的大负载测试
为了捕捉此类 bug,Rentgen 包含一个 大负载测试:
- 采用合法请求,仅放大请求体的大小。
- 保持 JSON 结构和请求头正确。
- 在大小阈值处期望立即返回 413。
任何其他响应都表明服务器在进行不必要的工作。
真实案例
该问题在 ChatGPT API 中被发现,超大负载被错误处理。报告后,bug 在一天内得到修复,展示了正确处理的重要性。
为什么此 bug 仍然存在
- 人为假设:开发者常认为通用错误码已经足够。
- 缺乏规范:正确的状态码是一个简单、 “乏味” 的修复,却能防止更大的问题。
简单的解决方案
- 对超过允许大小的请求返回 413 Payload Too Large。
- 确保服务器在早期拒绝请求,而不去处理请求体。
收获
始终返回 413 并不是要苛刻,而是要负责任。正确处理大负载可以防止不必要的资源消耗,保护你的 API 不受意外的 DoS 攻击。
完整故事和技术拆解: https://rentgen.io/api-stories/large-payload-handling.html