询盘表单收到垃圾询盘:
先分清三类,再决定拦哪一类
验证码只能挡住脚本。真人发的模板、自己人点的测试,得用另外两套办法。
先别急着加验证码。多数站加完,垃圾没少几条,真询盘反而少了一批。
垃圾询盘不是一个问题,是三个。三类混在一起,换什么工具都拦不准。
一、你的垃圾询盘,其实是哪三类?
把收件箱最近 30 条翻一遍,按下面的特征分堆,十分钟能分完。
1. 机器人:几秒一条,内容带链接
时间戳集中在几分钟内,邮箱像乱码,留言里塞着网址或者一串看不懂的词。这种提交不看页面,直接往接口里灌,一天能刷几百条。
它们还会填满所有字段。你加一个必填的公司名,它就填一串字母。这也是蜜罐字段能生效的原因。
2. 同行和货代:真人坐在电脑前发的
姓名像真的,邮箱是 Gmail,英文通顺,问的却是「你们做不做货代」「要不要 SEO 服务」。
人机验证对这类完全无效,因为对面本来就是人。
3. 自己人:测试、误点、重复提交
上线当天你点了三次提交,销售在客户面前演示了一遍,这些都会进收件箱。数量不多,但会让「最近垃圾变多」这个判断失真。
| 哪一类 | 一眼特征 | 怎么处理 |
|---|---|---|
| 机器人 | 秒级连发,留言带链接 | 边缘层丢掉,人机验证管用 |
| 同行群发 | 模板通顺,推销自家服务 | 关键词规则加人工拉黑,验证码不管用 |
| 自己人 | 公司网络,内容正常 | 加白名单,别当垃圾删 |
三类占比不同,做法也不同。
以同行群发为主的站,装验证码是白花钱。
二、为什么加了验证码,垃圾反而更多了?
它判的是「是不是人」,判不了「想不想卖你东西」
人机验证收集的是浏览器环境、鼠标轨迹、计算耗时这些信号。它只回答一个问题:这次提交来自人还是脚本。至于这个人为什么要提交,它不知道,也不负责。
所以机器人会少,同行不会少。你感觉「加了没用」,是因为烦你的那批本来就是人。
只放了前端组件,等于没装
这是最常见的装错。页面上加了组件,提交时不带校验,攻击者直接 POST 到接口,验证码根本不会触发。
Cloudflare 的文档把这条写成强制项,原话很直接:
“You must call the Siteverify API to complete your Turnstile implementation. The client-side widget alone does not protect your forms.”
官方原文:必须调用 Siteverify 接口才算完成接入,只有前端组件保护不了表单。同一页还写了两条:token 只在 300 秒内有效,且只能用一次,重复提交会返回
Cloudflare Docs · Validate the tokentimeout-or-duplicate。
拦在表单里,不如拦在边缘
请求已经进了函数,函数再拒,收件箱是干净的,但调用配额和日志已经被占掉。放在边缘拦,请求根本到不了你的代码。
顺序应该是先边缘、后表单。这个顺序反过来,成本差好几倍。
三、四层拦法,从零成本往上加
成本从低到高,四层。
第一层:蜜罐字段,今天就能加
表单里放一个正常用户看不见的输入框,名字别写 honeypot,写 website 或者 company_url。用 CSS 把它移出屏幕,不要用 display:none,一部分脚本会跳过隐藏元素。
提交时这个字段有值,直接丢掉。成本是两行 HTML,误伤率接近零。
第二层:同一 IP 的提交频率
判据很简单:正常客户一天最多提交两三次。同一个 IP 在 10 秒里超过 3 次,基本可以确定不是人。
这一层放在边缘,规则写成「路径等于表单接口、按 IP 计数、超出就拦 10 秒」,够挡掉绝大多数脚本。
第三层:Turnstile,免费额度够小站用
免费版的配额是:最多 20 个组件,每个组件 10 个域名,挑战次数不限,数据回看 7 天。对外贸站来说,这个量级几年都用不完。
三种模式里选 Managed 就行。风险低的人直接过,风险高的才弹一个复选框。文档里还有一句值得注意的话:
“Turnstile does not access, store, or transmit user communications, form entries, or other page inputs.”
官方原文:它不读取、不存储、不传输表单内容。客户填的公司名、采购量、图纸,都不经过它。对要过客户合规审查的外贸站,这句话比多拦几条垃圾有用。
Cloudflare Docs · Turnstile Overview
第四层:内容规则,只当兜底
留言里出现 3 个以上链接、出现货代或 SEO 这类推销词、姓名和邮箱明显对不上,标成待审。
标记,不要直接删。删掉的东西没人复查,误删一单就是几千美金。
| 这一层 | 拦得住什么 | 漏掉什么 / 会误伤谁 |
|---|---|---|
| 蜜罐字段 | 无脑填表的脚本 | 漏专门针对你写的脚本,误伤浏览器自动填充插件 |
| IP 频率 | 单点猛刷 | 漏分布式慢刷,误伤共用出口的公司网络 |
| Turnstile | 大部分自动化工具 | 漏真人发的模板,误伤老浏览器和禁用 JS |
| 内容规则 | 已知话术 | 漏新话术,误伤小语种的正常询盘 |
四、免费版的限速规则,够不够用?
Cloudflare 的速率规则按套餐分档,免费版给得很少:1 条规则,统计窗口 10 秒,封禁 10 秒,只能按 IP 计数。Pro 是 2 条、窗口最长 1 分钟、封禁最长 1 小时;Business 5 条;Enterprise 100 条。
这意味着免费版挡得住「一个 IP 猛刷」,挡不住「一万个 IP 各刷一次」。后者只能靠人机验证加内容规则。
说句实话:日提交不到 50 条的站,一条 10 秒规则加蜜罐就够了,不必为多几条规则升套餐。真被大规模刷的时候再升,那时你也知道该按什么维度限了。
五、误拦一个真客户,为什么比放过一百条垃圾更贵?
最容易被拦的是这几种人
公司网络共用出口 IP 的采购办,一个 IP 后面坐着几十个人;用 VPN 或代理的;浏览器版本老、JS 被禁的;用网页翻译打开你站的。这几种人在中东、非洲、东南亚客户里占比不低。
三个信号,说明你拦错人了
- 询盘总量掉了一半,垃圾只掉了三成。
- 老客户来信问「你们网站的表单是不是坏了」。
- 某个国家的提交归零,而那里原本是你的主力市场。
出现任何一条,先把规则调松,观察 2 周再收紧。规则卡得太死,先丢的是订单,不是垃圾。
留一条人工通道
表单下面放一行邮箱和 WhatsApp。真客户被拦,还有第二条路。这一行字几乎不占地方,但它是误拦的最后一道保险。
六、上线顺序:五步,别一次全开
一次全开,出了问题分不清是哪一层的锅。
- 先记 7 天原始提交。时间、IP、UA、留言全文,存到你自己的表里。没有基线,后面所有判断都是感觉。
- 加蜜罐。只加这一层,观察 3 天,看垃圾掉了多少。
- 加一条 IP 频率规则。阈值先放宽,10 秒 5 次;跑满 2 周确认没误伤,再收到 3 次。
- 加 Turnstile,并且接上服务端校验。前端组件加完不算完,接口必须验。
- 观察 2 周再动内容规则。前四层已经跑顺的站,第五步常常可以不做。
服务端校验就是一次 POST,命令行就能验:
curl -X POST 'https://challenges.cloudflare.com/turnstile/v0/siteverify' \
-d 'secret=你的_SECRET_KEY' \
-d 'response=前端提交上来的_token' \
-d 'remoteip=客户IP'
返回里 success 是 true 才放行。不是 true,看 error-codes:timeout-or-duplicate 是 token 过期或被重复使用,invalid-input-response 是伪造的。把这两个错误码分开记,能看出是客户提交太慢,还是有人在灌。
七、怎么证明拦对了?看哪三个数
上线前 2 周和上线后 2 周,各取一组:垃圾条数、真询盘条数、误拦条数。误拦这一项要人工数,从「客户来信说表单坏了」和待审队列里捞。
三个数一起看才有结论。只看垃圾降了多少,很容易把「连真客户一起拦掉」当成成果。
| 两周后看到 | 说明什么 | 下一步 |
|---|---|---|
| 垃圾降了,真询盘持平或上升 | 拦对了层 | 保持,只调阈值 |
| 垃圾降了,真询盘也降了 | 拦过头 | 放宽频率,把验证码切到 Invisible |
| 垃圾基本没变 | 多半没做服务端校验 | 回到表单接口,补 Siteverify |
八、这件事写进合同吗?
写。理由只有一条:垃圾询盘和误拦是同一件事的两面,谁有权限改规则,出事谁负责查。
- 规则谁配。边缘规则和表单校验属于交付范围,交接时要有文档,不能只存在某个人的账号里。
- 误拦谁查。客户报「表单打不开」,48 小时内要能说出是被哪条规则拦的。
- 记录谁留。被拦的提交至少留 30 天,含 IP、时间、内容摘要。
- 别写「保证零垃圾」。做不到的承诺写进合同,只会让双方都难看。
说句实话:我们自己的站也还在收同行群发的询盘。工具能挡掉机器和模板,挡不掉一个愿意花时间打字的人。目标是让收件箱能看,不是让收件箱空着。
常见问题
Q1加了验证码,垃圾询盘为什么没少?
因为烦你的多半是真人。人机验证只判「是不是人」,同行和货代群发的模板它一律放行。先按机器人、同行群发、自己人三类分堆,才知道该补哪一层。
Q2Turnstile 免费版有什么限制?
20 个组件、每个组件 10 个域名、挑战次数不限、数据回看 7 天。小站几年用不完。但只在页面放组件不算接入,必须服务端调 Siteverify 校验 token,否则等于没装。
Q3免费版 Cloudflare 能配几条限速规则?
1 条,统计窗口 10 秒、封禁 10 秒,只能按 IP 计数。Pro 2 条、Business 5 条。它挡得住单点猛刷,挡不住一万个 IP 各刷一次,那种要靠人机验证加内容规则。
Q4怎么判断拦过头,把真客户也拦了?
看三个信号:询盘总量掉一半而垃圾只掉三成、老客户来信问表单是不是坏了、某个主力市场提交归零。出现一条就先把规则调松,观察 2 周再收紧。
资料来源
- Cloudflare Docs · Turnstile Overview(三种组件模式、非交互挑战的机制、不读取表单内容的原文)
- Cloudflare Docs · Turnstile Plans(免费版配额:20 个组件、每组件 10 个域名、挑战不限次数、数据回看 7 天)
- Cloudflare Docs · Validate the token(必须服务端校验、token 300 秒有效且一次性、Siteverify 请求参数与错误码)
- Cloudflare Docs · Rate limiting rules(各套餐规则条数、计数周期与封禁时长上限)