← 返回文章列表

表单与机器人的限流、队列和反垃圾

限流(rate limit)队列反垃圾是三层防护 - 没有它们,表单和 Telegram/Discord 机器人很快会变成垃圾、刷屏和 DoS 的通道。单靠 CAPTCHA 不够:需要频率限制、异步处理,以及对内容和信誉的过滤。下面 - 如何在不过度复杂的前提下,为网站和机器人搭一套可落地的方案。

  • Rate limit - 同一 IP、账号或令牌在时间窗口内允许多少次请求
  • 队列 - 接收请求与重活(邮件、CRMLLMwebhook)之间的缓冲
  • 反垃圾 - honeypot、CAPTCHA、启发式、黑名单和内容检查
  • 原则 - 先压频率并异步处理,再加强过滤器
  • 目标 - 留住真人线索,并在僵尸网络冲击下保持服务可用

为什么表单和机器人最先被打

公开接口等于没上锁的门。垃圾机器人会扫 /contact/api/lead 和机器人 webhook,然后海量投递:钓鱼、SEO 垃圾、撞库、暴力破解优惠码。没有限制时,邮件/短信/LLM 账单上涨,CRM 被垃圾填满,真实线索淹没在噪声里。

常见症状:

  1. 表单 POST 暴增,销售转化却为零
  2. 不同 IP 发相同文案 - 或同一网段发「各不相同」的垃圾
  3. 邮件或 webhook 队列撞上服务商限额
  4. 即时通讯机器人应答变慢或超时

Rate limit:限制什么、怎么限

限流回答的是:「这个接口在 N 秒内可以被打多少次?」限流键很关键。

适用场景 风险
IP 匿名表单、无鉴权 webhook NAT 与企业网会误伤好人
User / chat_id 已登录 API 与机器人 登录前无效
API 令牌 / 会话 合作方集成 令牌被盗会耗尽整份额度
Fingerprint + IP 强表单反滥用 实现与对用户解释更难

实用窗口:

  • 线索表单: 每 IP 每 10 分钟 3-5 次成功提交,并对失败(校验失败、CAPTCHA 失败)设更严上限
  • 登录 / OTP: 单独且更严 - 否则容易被爆破
  • 机器人命令: 每个用户每隔几秒允许 1 次重应答(生成、搜索);轻命令可更松
  • 进程或 worker 的全局上限 - 即使键不同,也能扛住尖峰

超限时:返回 HTTP 429Retry-After;在机器人里简短提示「请等待 N 秒」,不要暴露内部阈值。记录触发日志:可以看出限额偏松还是偏紧。

队列:为何要把接收与处理分开

表单不应同步写 CRM、生成 PDF 再调外部 API。队列(Redis、RabbitMQ、SQS、Celery、BullMQ)在校验后立刻接任务,并向用户快速返回:「请求已受理」。

队列带来的收益:

  • 削峰 - 垃圾或投放高峰不会拖垮 Web 进程
  • 失败重试 - 带 backoff 的 retry,而不是丢线索
  • 优先级 - 已付款订单高于「下载 PDF」
  • 隔离 - LLM/邮件 worker 与前端独立扩缩

表单流程:

  1. CSRF / origin、honeypot、字段基础校验
  2. Rate limit
  3. 将线索写入数据库,状态为 queued
  4. 推入队列
  5. 向用户返回 HTTP 200/202
  6. Worker:反垃圾打分 → CRM / 邮件 / 通知

机器人同理:快速接收 Telegram 更新;重应答(RAG、出图、解析)进队列。否则 long polling / webhook 延迟会堆积。

反垃圾:多层,而不是一个勾选框

一个 reCAPTCHA 解决不了问题。要做纵深防御

1. 入口处的廉价过滤

  • Honeypot 字段(对人隐藏,机器人会填)
  • 最短填写时间(过快 = 机器人)
  • 校验 Referer / Origin 与 CSRF 令牌
  • 限制请求体大小与附件数量

2. CAPTCHA 与挑战

信号展示挑战,而不是永远展示:N 次尝试后、可疑 IP、高分风险。常驻 CAPTCHA 伤转化;按需几乎不伤。

3. 内容与信誉

  • 文案中的域名/URL 黑名单
  • 识别重复模板与跨语言垃圾
  • 邮箱检查(MX、一次性域名)
  • 机器人侧:链接过滤、停用词、媒体上限

4. 行为信号

历史:该设备提交有多少变成成交或有意义对话。新 IP 一分钟内几十条「buy seo」应进隔离区或人工审核,而不是直接进销售 CRM。

如何把三层串起来

生产环境建议顺序:

  1. 校验与廉价反垃圾(honeypot、大小、CSRF)
  2. 按 IP + 用户/chat id 限流
  3. 快速响应客户端 / 即时通讯
  4. 队列,并为每个 worker 设并发任务上限
  5. 在 worker 中做重反垃圾与集成(打分、CRM、邮件)
  6. 告警:429 尖峰、被拒任务增长

这样就不会把 CPU 和服务商预算浪费在本该被限额挡住的请求上。

落地检查清单

  • [ ] 表单与机器人按风险设置不同限额
  • [ ] 对外邮件/短信/LLM 有全局熔断
  • [ ] 429 与机器人提示对人清晰,但不暗示如何绕过
  • [ ] 队列有 DLQ(死信)与长度监控
  • [ ] 可疑线索进隔离区,而不是静默删除
  • [ ] 限流与垃圾分日志在无完整个人信息时仍可用
  • [ ] 压测:/contact 在 100 RPS 时会发生什么

小结

限流压频率,队列护住后端与集成预算,反垃圾把垃圾与线索分开。三者必须一起用:有限额无队列仍会打垮同步处理;有队列无过滤会把垃圾灌进 CRM;有过滤无限额在 DDoS 下会变得很贵。

若需要按你的技术栈设计表单与机器人防护(限额、队列、隔离区、监控)- 请联系我。支持与迭代参考见价格页

常见问题

限流和反垃圾有什么区别?

限流数次数;反垃圾看内容与行为。 限额即使面对「干净」请求也能挡住刷屏;反垃圾能抓住次数不多但仍有毒的垃圾。

线索量很少还需要队列吗?

需要,只要有外部 API、邮件或 LLM。 即便流量低,同步 CRM 超时也会毁掉表单体验。队列空闲时成本低,峰值时能救命。

每个表单都必须上 CAPTCHA 吗?

不必。 更宜按风险展示挑战:错误连发后、IP 信誉差、或异常分数时。少打扰真人,仍能挡机器人。

机器人按 chat_id 限还是按 IP 限?

两个都要。 chat_id 挡住单用户刷屏;IP/webhook 令牌防御伪造更新与扫描。群组限额通常比私聊更严。

看起来像垃圾的线索怎么办?

进隔离区做人工复核或延迟投递,不要无痕迹丢进垃圾桶。否则会丢掉偶发真线索,也看不到攻击模式如何演变。

本文术语

CRM — Customer Relationship Management — 客户关系管理

webhook — HTTP callback when an event happens — 事件发生时触发的 HTTP 回调

LLM — Large Language Model — 大语言模型

Celery — Python task queue for background jobs — Python 后台任务队列

RAG — Retrieval-Augmented Generation — 检索增强生成

DDoS — Distributed Denial of Service — 分布式拒绝服务攻击

联系方式