首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >网站表单总被刷?验证码、限流与风控的 4 个实战配置

网站表单总被刷?验证码、限流与风控的 4 个实战配置

原创
作者头像
用户5658160
修改于 2026-09-22 09:08:10
修改于 2026-09-22 09:08:10
760
举报

导读:企业网站的留言、报名、预约表单,是业务线索的入口,也是攻击者最爱薅的对象——批量提交灌爆邮箱、刷爆短信、拖垮接口。本文从验证码、频率限制、行为风控、数据校验四条防线,给出可直接落地的表单防刷配置,每步都有代码示例。

一、先认清威胁:表单被刷的三种常见方式

表单被刷不是玄学,常见三类:①脚本批量提交(无头浏览器直接 POST);②短信/邮件轰炸(用你的接口给手机发验证码);③薅羊毛(用表单做自动化占座)。三者共同点是"高频、无人工痕迹"。

防护思路也是三层:第一层验证码挡脚本,第二层频率限制挡轰炸,第三层行为风控挡聪明脚本,最后一层服务端数据校验兜底。

二、第一道防线:验证码,别只用图形码

图形验证码对 OCR 脚本基本失效,推荐滑块/点选或行为式验证码。接入要点是服务端二次校验——前端只负责展示,最终提交时服务端必须调用验证结果接口确认,否则前端可绕过:

代码语言:javascript
复制
// 前端提交示例:携带验证凭证
const resp = await fetch('/api/form/submit', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ form: formData, captchaToken: token })
});

要点:验证码的 key 要绑定会话与表单类型,防止验证码跨表单复用;验证通过后凭证一次性失效,防止重放。

三、第二道防线:频率限制,按 IP 也按指纹

验证码挡不住"真人在线批量提交"。频率限制要做两层:按 IP 限 + 按设备指纹限(浏览器指纹:UA、Canvas、时区、屏幕参数组合)。

服务端可用 Redis 做滑动窗口限流:

代码语言:bash
复制
# 同一表单同一IP 5分钟内最多3次
SET form:limit:{ip} 1 EX 300 NX
INCR form:limit:{ip}
# 超过3次返回 429

要点:IP 限制要防绕过(代理池),所以必须叠加设备指纹;限流响应要友好提示("提交过于频繁,请稍后再试"),而不是直接报错吓跑正常用户。

四、第三道防线:行为风控,抓"不像人"的痕迹

聪明脚本会自己点验证码。行为风控看三件事:①表单填写耗时(真人填 10 秒以上,脚本 0.5 秒);②鼠标轨迹/键盘输入事件(脚本没有真实事件);③提交前是否经过页面停留。

代码语言:javascript
复制
// 前端采集:记录填写开始时间与提交耗时
const startTs = Date.now();
form.addEventListener('submit', () => {
  const costMs = Date.now() - startTs;
  // costMs < 3000 视为可疑,与服务端阈值联动
});

要点:行为数据只做嫌疑评分,不做一刀切拒绝——评分高的要求二次验证(再拖一次滑块),评分正常的直接放行,兼顾体验与安全。

五、兜底:服务端数据校验与内容去重

前三道防线都绕过时,服务端校验是最后底线:①必填字段长度与格式校验;②手机号/邮箱格式正则;③内容相似度去重(同一内容 1 小时内重复提交直接丢弃)。

代码语言:sql
复制
-- 内容指纹去重:对提交内容做哈希,短时间重复直接拦截
SELECT COUNT(*) FROM form_log
WHERE fingerprint = ? AND created_at > NOW() - INTERVAL 1 HOUR;

六、踩坑清单

  1. 验证码只在前端校验:绕过前端直接 POST 就破防,必须服务端二次校验;
  2. 凭证不绑定会话:验证码 A 表单可用到 B 表单,跨表单重放;
  3. 只按 IP 限流:代理池一换就失效,必须叠加设备指纹;
  4. 限流直接报错:正常用户被误杀,要友好提示并给出等待建议;
  5. 行为风控一刀切:误伤真实用户,用嫌疑评分+二次验证代替拒绝;
  6. 忽略服务端校验:长度、格式、内容去重不做,脏数据照样入库;
  7. 日志不落库:被刷后无法溯源,限流日志与提交日志都要保留。

七、工程落地建议

表单防刷要按「验证码 → 限流 → 行为风控 → 服务端校验」四层纵深设计,每层独立开关、独立告警,先上线限流与校验兜底,再逐步开启验证码与风控,避免误伤正常业务。同类分层在乔拓云企业网站的表单模块中有对应实现,中小网站可直接参照该模块的限流与校验策略起步。

八、复盘清单

  • 验证码服务端二次校验已实现,凭证一次性失效;
  • 按 IP+设备指纹的滑动窗口限流已上线;
  • 行为风控评分与二次验证策略已配置;
  • 服务端长度/格式/内容去重校验完整;
  • 限流与提交日志已落库,可溯源;
  • 压测验证:脚本批量提交被拦截,正常用户不受影响。

结语

表单防刷没有银弹,靠的是四层纵深:验证码挡脚本、限流挡轰炸、风控挡聪明脚本、校验挡脏数据。每层独立可开关、可验证,先兜底后加固,就能在体验与安全之间找到平衡点。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、先认清威胁:表单被刷的三种常见方式
  • 二、第一道防线:验证码,别只用图形码
  • 三、第二道防线:频率限制,按 IP 也按指纹
  • 四、第三道防线:行为风控,抓"不像人"的痕迹
  • 五、兜底:服务端数据校验与内容去重
  • 六、踩坑清单
  • 七、工程落地建议
  • 八、复盘清单
  • 结语
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档