应用安全

AI 图片生成平台如何防止 API 被刷?

图片生成接口单价高、排队敏感,一个并发刷请求就足以打满 GPU 队列。本文按「成本倒推阈值」的思路,给出针对文生图接口的限流、配额与滥用识别方案。

图片生成接口和普通 API 的三个本质差异

维度 普通查询 API 图片生成 API
单位请求成本 近似零 单次推理电费 + GPU 折旧,通常是前者的几十到上千倍
扩容弹性 秒级扩容 GPU 卡有限,排队时间随并发快速上升
参数敏感度 字段合法性为主 分辨率/步数/批量数直接线性放大算力消耗

正因为供给刚性,攻击者不需要打满带宽,只要维持几十个并发的生成请求,就能让付费用户感知到「生成变慢」——这是一种以极低代价换来的体验打击。

治理重心在队列,不在请求数

图片生成真正的瓶颈是 GPU 队列。下面这张图把任务从提交到出图的三个卡点标了出来:限流应该贴着卡点设计,而不是笼统地限制「每分钟多少次」。

任务链路上的三个卡点 ① 提交 参数边界校验 ② 入队 并发 / 未完成任务上限 ③ 推理 GPU 队列 ④ 取结果 Webhook,不要高频轮询 卡点 ② 才是图片生成真正的闸门 GPU 供给刚性,排队时间随并发非线性上升;限制「每分钟请求数」管不住「同时挂着的重任务」 同步 vs 异步的攻击成本差 同步:攻击者须维持连接 异步:提交即可断开,成本极低 边缘能做的 vs 你要做的 边缘:速率抑制、bot 识别、复杂度计分(Enterprise + ARL,需源站响应头返回 1–1,000,000 的分值) 应用层:分辨率/步数/批量数硬上限、并发与未完成任务上限、超时回收、点数账本
图 1:图片生成的瓶颈在 GPU 队列。异步接口把攻击成本压到极低,因此「并发未完成数」上限比「每分钟请求数」更关键——后者边缘可协助,前者只能由应用层实现。

三步把「刷新型刷量」掐断

第一步:给参数设硬上限。 在网关或应用层明确最大分辨率、最大步数、单次批量张数,对越界请求返回 400 而不是「尽力生成」。这一步不依赖任何安全产品,却是性价比最高的一层。

第二步:按算力维度做配额。 把参数组合折算成统一「算力点数」(例如 512×512 记 1 点、1024×1024 记 4 点),再对租户或凭据设置每日点数配额。

Cloudflare 上的对应能力与门槛:想把请求正文里的参数当作限流计数键,需要 Advanced Rate Limiting(Enterprise 付费附加项)——官方文档把 JSON 正文字段、表单字段、JWT 声明这几类计数维度列在高级能力里。标准版 Rate limiting rules 的计数维度受套餐限制,免费档只能按 IP 计数。 更契合本场景的是复杂度计分:由源站在响应头返回本次请求的开销分值(取值须在 1 至 1,000,000 之间),边缘按周期累加并与「每周期总分」比较,超过即触发规则动作。它对「不同分辨率与步数的成本差」天然匹配。 两个坑:一是源站没有返回合规分值时,对应的限流计数器不会更新、规则会静默失效,务必加探测告警;二是低套餐用不上复杂度计分,就把点数折算与计数放在应用层,边缘只做粗粒度抑制。

第三步:识别自动化来源。 滥用者几乎不用浏览器,而是直接脚本调用 HTTP 接口。Cloudflare 的 Bot 防护基于 TLS 指纹、请求节奏规律性和缺少正常导航行为来打分,对可疑请求下发挑战或要求校验后再进入排队。注意:细粒度 bot score(1–99,1 表示确认为自动化流量)需要 Enterprise 的 Bot Management 订阅,其余套餐只有分组视图。

治理异步任务的两个专项

轮询刷(polling abuse):任务提交后客户端高频查询状态。应给查询接口单独设更高的阈值且不带副作用缓存,或改用 Webhook/长轮询,避免状态查询本身成为放大攻击面。

僵尸任务(zombie jobs):大量提交任务后不取结果,占满队列且不释放。做法是「提交即占额度、超时未取自动回收」,并对同一凭据的未完成任务数设上限。

这两项都是应用层治理:队列是你的,边缘产品无法替你排队和回收任务。

配额建议表

对象 建议配额 触发动作
未登录 / 试用 每日 5~20 点 超出后需完成人机校验或绑定支付方式
免费注册用户 每日 50~100 点 阶梯解锁,异常降回初值
付费个人版 按套餐点数 超配额 429 并提示升级
单凭据并发生成数 1~3(视套餐) 排队而非拒绝,避免报错风暴
单凭据未完成任务 ≤ 5 新提交被拒直到有任务完成

阈值不是安全数字,请用「单张毛利 ÷ 单次推理成本」反推允许的最大免费点数,再乘一个安全系数往下取整。并发与点数的精确上限必须落在应用层,因为边缘计数器按数据中心独立累计。

Cloudflare 能力 vs 应用层职责

事项 Cloudflare 能给到的 应用层必须做的
参数边界校验 WAF 自定义规则(条数受套餐限制) 分辨率/步数/批量数硬上限与 400 语义
按成本限流 复杂度计分(需 ARL + 源站返回分值) 点数折算口径与版本维护
并发与队列 边缘按速率粗粒度抑制 并发上限、未完成任务上限、超时回收
强身份 mTLS(全套餐可用) 每租户凭据与额度账本
自动化识别 bot score / 分组(取决于套餐) 「提交却不取结果」的行为判定

套餐与计费细节见 AI SaaS 如何防止 API 被恶意调用?,模型侧统一观测见 AI Gateway。

边界与不适用情况

  • 按分钟计费的自建 GPU 集群没有「请求数」概念,按请求限流要换成队列治理与抢占式调度。
  • 开放第三方模型插件生态时,调用方可能是合法机器人,避免过度依赖浏览器指纹,优先用 mTLS 或签名请求辨认来源。
  • 限流返回值要给机器可读的重试信息(如 Retry-After),否则客户端盲目重试会制造二次风暴。
  • 不要指望边缘规则保证精确配额:文档明确说明限流规则不是用来保证精确请求数的。

常见问题

已经给 API 加了 QPS 限制,为什么 GPU 还是被打满? 因为 QPS 不管「每个请求多重」。攻击者把单次请求参数调到最大,用 1 个请求吃掉普通用户 20 次的算力。必须按算力点数或参数组合限流。

复杂度计分怎么落地?需要什么套餐? 需要 Enterprise + Advanced Rate Limiting。做法是源站在响应头返回本次开销分值(取值 1–1,000,000),边缘按周期累加,超过「每周期总分」即触发规则动作。若源站没返回合规分值,计数器不更新、规则静默失效——这是最常见的落地失败原因。低套餐的等价做法是把点数折算与计数放在应用层。

图片生成要不要上 WAF? 要,但目的不是挡盗刷——而是挡住 Web 端入口处的注入、SSRF(参考图 URL 拉取)等攻击;真正的成本防护靠配额和限流。

异步接口为什么比同步更容易被刷? 同步接口至少受响应时间约束,攻击者必须维持连接;异步接口提交成本极低,可以瞬间灌入成千上万个任务。因此异步必须配合「并发未完成数」上限。

相关阅读

参考来源

以下为 Cloudflare 官方文档页面,本文涉及的功能可用性、配额与限制以此为准;功能会随产品更新变化,以控制台实际可见项为准。

← 返回文章列表

Cloudflare 官方合作伙伴

正在为海外业务做架构决策?

企业版选型、架构咨询、风险评估——把你的场景告诉我们,我们给出可落地的方案和路径。

作为 Cloudflare 合作伙伴,我们可以为你提供:

预约咨询