跳转到内容
FFormhook
返回博客

博客

联系表单垃圾信息:honeypot、速率限制与 Turnstile

· 1 分钟阅读

发布一个表单,等上几天,机器人就会找到它。理解它们如何运作,会让防御手段变得显而易见--也说明了为什么正确答案是分层防护,而不是一个终极 CAPTCHA。

认识你的对手:三种表单垃圾信息

  1. 愚蠢的爬虫--在网上寻找每一个 <form> 并向 action URL 疯狂发送 POST 请求的脚本。它们会填写看到的每一个字段。这是绝大部分的垃圾信息量。
  2. 定向洪流--某人(或某人的僵尸网络)专门轰炸你的端点,往往只是因为它存在。
  3. 人工刷单团伙--真人受雇填写表单。对联系表单来说很罕见;没有任何自动化防御能完全阻止他们,但这没关系--他们只是舍入误差。

下面每一层都对应其中一种情况。

第一层:honeypot(拦截爬虫)

honeypot 是一个人类永远看不到的额外输入框--通过 CSS 隐藏--但愚蠢的机器人会尽职尽责地填写它,因为它就在标记里:

<input type="text" name="website" tabindex="-1" autocomplete="off"
       style="position:absolute;left:-9999px" aria-hidden="true">

服务端规则:如果该字段提交时非空,这条提交就是垃圾信息。静默接受它(返回 200)并丢弃,让机器人学不到任何东西。这一招就能消除绝大多数垃圾信息,且对人类摩擦--没有验证谜题,没有点击,什么都没有。

值得注意的细节:给它起一个诱人的名字(websitephone2),让它脱离 tab 顺序,并标记 aria-hidden 以便屏幕阅读器跳过它--对无障碍功能不可见,而不仅仅是视觉上隐藏。

第二层:速率限制(拦截洪流)

当机器人每分钟发送 500 次看起来合法的 POST 数据时,honeypot 帮不上忙。按 IP 和按表单的速率限制可以:真实的人不会在六十秒内提交十次联系表单,所以限流不会损失任何有价值的东西。限制应该设在接收端点处,在存储和通知之前--否则即便被标记,洪流仍会填满你的收件箱。

第三层:Turnstile(当压力需要一次挑战时)

当表单吸引来更聪明的机器人--能渲染 CSS 并绕过你的 honeypot 的无头浏览器--你就需要升级到一次挑战验证。Cloudflare Turnstile 是现代的选择:它通过浏览器信号验证人类身份,通常在用户无感知的情况下完成,不需要那些消防栓照片问答。流程是标准的:页面上的小部件生成一个令牌,接收服务器向 Cloudflare 验证该令牌,没有有效令牌的提交会被拒绝。

Turnstile 是那种在需要时才添加的层,而不是预先添加--每一次挑战,无论多么温和,都会消耗一点转化率。

当这是别人的工作时会是什么样子

如果你自己运营表单接收端,你就要实现全部三层防护--而且要让它们永远正常运作。这正是表单后端存在的一大意义。Formhook 在所有套餐(包括免费版)中默认提供 honeypot、按 IP 和按表单的速率限制,以及按表单的 CORS 白名单;当你需要额外的防护层时,Turnstile 只是表单设置里的一个复选框。

无论你选择哪条路线,策略都是一样的:先上无形的防御,人类可见的挑战放在最后,永远不要把 CAPTCHA 当作第一招。

一行代码上线可用的表单

欧盟托管,提交记录永久保存,所有套餐均支持推送通知。

免费开始

无需信用卡 · 阅读文档

继续阅读