返回博客
基础知识 发布于 19.08.2026 阅读约 1 分钟

什么真正保护表单:CAPTCHA、蜜罐、时间陷阱、CSRF

多数联系表单仅靠一种技巧防垃圾信息,其中许多只能阻止最简单的机器人。本文说明各防护层能阻止什么、有何代价,以及如何合理组合。

联系表单垃圾信息很少来自手动输入的人。通常是软件发现表单、填写每个字段并发送结果——重复数千次。现有多种防御措施,作用于截然不同的环节。理解每种措施的实际作用,有助于避免两种错误:表单没有真正防护,以及防护过重导致真人放弃。

防护层比较
防护层及其拦截对象
  • 蜜罐:填写所有字段的简单机器人
  • 时间陷阱:加载后立即提交的脚本
  • CAPTCHA:大多数通用自动化
  • CSRF 令牌:直接发送至端点的请求
  • 速率限制:来自单一来源的海量请求
  • 工作量证明:低成本批量提交,无跟踪或谜题
  • 服务器端检查:所有绕过浏览器的内容
遗漏或代价
  • 有针对性的机器人会跳过;隐藏不当时屏幕阅读器会读出
  • 无法阻止等待后提交的机器人;无服务器端签名时易伪造
  • 所有人的障碍、无障碍障碍、通常涉及第三方;存在代解服务
  • 先加载页面的机器人也能取得有效令牌
  • 分散在多个 IP 地址的垃圾信息
  • 无法阻止拥有计算资源且意志坚定的发送者;需要 JavaScript
  • 单靠它们不能解决一切——但没有它们,其他层都只是摆设
没有任何单层能覆盖所有问题。低成本、不可见的层过滤大部分垃圾信息;较重的措施用于顽固、有针对性的垃圾信息。

蜜罐与时间陷阱:不可见过滤器

蜜罐是人永远看不到的额外字段,例如用 CSS 隐藏的“website”字段。简单机器人填写所有字段,因此蜜罐被填表明自动化,服务器可静默丢弃消息。专门针对您网站编写,或像浏览器一样渲染页面的机器人会跳过它。务必正确隐藏:仅移出屏幕的字段可能被屏幕阅读器读出、通过 Tab 键到达,或被自动填充。使用 aria-hidden、tabindex -1 和 autocomplete off,并提供中性标签,要求意外到达该字段的人留空。

时间陷阱记录表单提供时间,并拒绝快得不合理的提交。人需要几秒阅读和输入;许多脚本不到一秒就提交。时间戳必须在服务器检查,并防止篡改,例如签名或存于会话——普通隐藏时间字段会被机器人直接改写。阈值要低,因为自动填充也会让真人很快。只要等待的机器人仍可通过:时间陷阱是过滤器,而非围墙。

CAPTCHA:有效,但并非没有代价

CAPTCHA 要求证明当前不是机器人——从图片谜题到后台检查;常见服务包括 reCAPTCHA、hCaptcha、Cloudflare Turnstile 和 Friendly Captcha。它能阻止大多数通用自动化,因此广受使用。但每个可见谜题都可能让部分访客放弃,多数服务还加载第三方脚本,引出隐私和同意问题。CAPTCHA 也只有正确配置才有效:公开测试站点密钥、没有脚本的小组件,或服务器从不验证的令牌,看似防护,实则不是。formexposed.com 的免费检查会从外部指出此类错误。

无障碍也是代价之一。图片谜题将盲人和许多低视力人群排除在外,音频替代方式无法帮助聋盲人,复杂逻辑任务给认知障碍人群增加负担。WCAG 2.2 成功准则 1.1.1 要求提供描述 CAPTCHA 目的的文本替代,以及面向不同感官的替代形式。后台检查可避免大部分问题,但一旦判为可疑,备用方案常又是视觉谜题——请用键盘和屏幕阅读器测试该路径。

CSRF 令牌:防伪造,而非防垃圾信息

CSRF 令牌是服务器放入表单并期望随提交返回的随机值。它原本用于防范跨站请求伪造,即其他网站让访客浏览器发送本人无意发出的请求。在公开联系表单中,它有附带作用:不加载页面而直接向表单地址提交的机器人会被拒绝。任何先获取页面并带回令牌的机器人都能通过。多数框架和表单插件本就提供 CSRF 令牌——保持启用,但不要将其算作垃圾信息防护。

服务器上必须发生什么

仅在浏览器中检查,毫无防护作用
任何仅在浏览器运行的内容——JavaScript 验证、检查蜜罐的脚本、无人验证的 CAPTCHA 令牌——只要有人直接发送请求,就会被跳过。是否接受消息的所有决定都应由服务器作出。
  • 在服务器重新验证每个字段:必填、长度、电子邮件格式,并禁止最终进入邮件标头的字段包含换行。
  • 每次提交都向签发服务或通过自有代码验证 CAPTCHA 和工作量证明令牌,并拒绝重复使用的令牌。
  • 按 IP 地址和时间窗口限制提交。这可阻止单一来源的洪泛;分散到多个地址的垃圾信息需要其他防护层。
  • 考虑工作量证明:发送前,浏览器解决一项小型计算任务。访客看不到谜题,也不受跟踪,但批量提交的成本会提高。

合理组合:两到三层

  1. 1从不可见层开始:符合无障碍要求的蜜罐和带签名的时间陷阱,两者均在服务器验证。
  2. 2增加按 IP 地址的速率限制,使单一来源无法淹没表单。
  3. 3如果有针对性的垃圾信息仍可通过,增加工作量证明或 CAPTCHA——优先选择没有可见谜题且有无障碍替代方式的方案。
  4. 4保留框架提供的 CSRF 令牌——将其视为额外帮助,而非防御手段。
  5. 5以访客身份测试结果——仅用键盘、使用屏幕阅读器、在手机上——并检查真实消息仍能到达。

在许多网站上,蜜罐、时间陷阱和速率限制组合起来,已可在没有可见障碍的情况下清除大多数通用垃圾信息;CAPTCHA 是不足时的后备措施。在 WordPress 上,免费的 formexposed 插件组合蜜罐、时间检查和工作量证明,无需 Google。要查看表单从外部呈现的情况——有哪些层、CAPTCHA 是否有效配置——formexposed.com 的免费检查仅需域名,无需账户。它无法看到服务器代码,因此服务器端部分仍由您负责。