CAPTCHA 在那里,却没有任何保护
可见的 reCAPTCHA、hCaptcha 或 Turnstile 小组件,并不能充分说明表单是否受保护。本文介绍典型配置错误,以及如何在几分钟内检查自己的表单。
许多网站所有者为联系表单添加 CAPTCHA,看到小徽章或复选框出现,就认为垃圾信息问题已经解决。然而垃圾仍持续到来。通常 CAPTCHA 本身没有问题——它只是没有连接到任何能阻止机器人的机制。本文说明 reCAPTCHA、hCaptcha 和 Cloudflare Turnstile 如何常常沦为摆设,以及如何检查自己的表单。
防护实际发生在哪里
这三种服务原理相同。浏览器中的脚本执行检查,并向表单提供令牌——一个表示“此访客已通过”的短字符串。令牌随表单提交到您的服务器。真正的决定仅在那里发生:服务器将令牌连同服务端密钥发送给提供商,并收到答复——成功或失败,reCAPTCHA v3 还会返回评分。链条中任何一环缺失,小组件看起来仍可能完全正常,但直接向表单处理程序提交的机器人会畅通无阻。
放行一切的测试密钥
Google、hCaptcha 和 Cloudflare 发布专用测试密钥,使开发者无需解谜即可运行自动测试。配合对应测试服务端密钥,验证总会成功——这正是其用途。它们用于本地和预发布环境,却经常在迁移生产环境时被保留:开发者构建时粘贴进去,网站上线,却没人替换。reCAPTCHA 至少会在小组件中提示仅供测试,但不可见配置下几乎无人查看。如果测试站点密钥和测试服务端密钥均用于线上,每次提交都通过,无论来自真人还是机器人;如果仅站点密钥为测试密钥,验证反而会失败,真实消息可能被拒绝。
无人检查的令牌
第二种典型情况是服务器从不向提供商查询。小组件运行、令牌生成并提交,表单处理程序却直接忽略。常见于手写表单、仅涵盖浏览器端的复制代码片段,以及未完成的插件设置。类似情况是:服务器确实调用验证服务,却只检查请求是否成功发出,不检查答复内容。或者将 reCAPTCHA v3 评分阈值设为 0,接受服务可能返回的任何评分。有些处理程序还会“故障时放行”:令牌缺失或验证失败,仍接受消息——机器人只需省略令牌。
小组件从未真正加载时
其他配置错误则破坏浏览器端。如果站点密钥未注册该域名——常见于从预发布迁到生产、变更域名或新增子域名后——提供商拒绝签发令牌,并在小组件或浏览器控制台显示错误。切换主题或更新插件后,页面可能仍有小组件标记,但使其运行的脚本已消失。如果 Cookie 同意工具在访客同意前阻止 CAPTCHA 脚本,也会有相同效果。之后取决于服务器:若坚持有效令牌,真实访客将无法发送消息,却无人察觉咨询丢失;若不坚持,机器人便可自由通过。
还有两种情况容易忽略。对于 reCAPTCHA v3,角落徽章仅表明页面某处加载了脚本——可能由主题或其他插件加载——而表单插件自身的集成已关闭。此外,缓存插件可能连同 HTML 中嵌入的令牌一起缓存页面。CAPTCHA 令牌仅有效几分钟,且只能验证一次,因此缓存令牌对真实访客会失败;诱人的“修复”方式是关闭检查,却会悄悄移除防护。
- 小组件显示“仅供测试”提示
- v3 徽章显示在角落
- 小组件显示并返回令牌
- 垃圾信息停止了,真实咨询也停止了
- 使用公开测试密钥,每次验证均成功
- 表单插件的 reCAPTCHA 集成已关闭
- 服务器从不发送令牌进行验证,或忽略结果
- 站点密钥未注册该域名,或缓存令牌已过期
简短自查
- 1在隐私窗口中打开表单页面,打开浏览器开发者工具,检查控制台是否有 CAPTCHA 脚本错误。
- 2确认小组件确实出现——接受 Cookie 横幅前后各检查一次——并确认缺少小组件时无法发送表单。
- 3在提供商管理控制台确认站点密钥包含您的线上域名(包括 www 等变体),并确认表单插件或代码中的密钥与之匹配,而非文档或预发布设置中的密钥。
- 4在表单插件设置中确认此特定表单已启用 CAPTCHA 集成;对于 reCAPTCHA v3,确认评分阈值大于 0。
- 5如果可访问代码,请找到服务器端验证,确认答复为否或令牌缺失时会拒绝提交。
- 6将表单页面排除在整页缓存之外,或确保浏览器新生成令牌。
- 7发送真实测试消息并确认到达;变更主题、插件或同意工具后重复检查。
CAPTCHA 是一层,而非全部防护。与蜜罐字段、时间检查和服务器端过滤组合后,某处配置错误不至于使表单完全敞开。如果您想快速了解表单状况,请在 formexposed.com 输入域名——报告会显示 CAPTCHA 设置中外部可见部分是否正常。