前端 onsubmit return false 无法防爬虫,因爬虫不执行 JS、直接发 HTTP 请求;须服务端校验 Referer/User-Agent(仅初级过滤)、CSRF Token+时效签名(核心)、行为验证与速率限制。

为什么 onsubmit 里加 return false 挡不住爬虫
因为爬虫根本不执行 JavaScript,它只发 HTTP 请求。你前端加的任何 onsubmit、event.preventDefault() 或按钮禁用逻辑,对直接构造 POST 请求的爬虫完全无效。它们绕过 DOM,直调接口,甚至根本不用打开页面。
必须在服务端拦截:验证 Referer 和 User-Agent 的实际效果
这两个 HTTP 头能筛掉最基础的工具型爬虫(比如用 curl 或 Python requests 默认发起的请求),但极易伪造——只要加一行 headers={'User-Agent': 'Mozilla/5.0...', 'Referer': 'https://yoursite.com/form'} 就能绕过。所以只能作为初级过滤,不能单独依赖。
-
Referer在无来源跳转(如书签、HTTPS→HTTP)下可能为空,误杀合法用户 -
User-Agent白名单太窄会挡掉 Edge、Firefox 新版本;太宽等于没设 - 两者都可在 Nginx 或后端中间件(如 Express 的
req.get())里快速校验,但仅建议用于日志标记或限速触发条件
真正有效的方案:CSRF Token + 时效性表单签名
核心是让每个表单提交携带一个“一次一换、有时效、绑 session”的凭证。爬虫即使拿到页面 HTML,也无法复用 Token,更无法生成新签名。
- 生成时:服务端为每个用户 session 生成随机
csrf_token,嵌入表单隐藏域:<input type="hidden" name="csrf_token" value="a1b2c3..."> - 提交时:同时校验
csrf_token是否存在、是否匹配当前 session、是否未过期(例如 10 分钟) - 进阶加固:对表单字段做签名,比如拼接
action+timestamp+user_id+secret_key后 SHA256,放在form_signature字段里,服务端重算比对
注意:Token 绝不能通过 URL 传递(易被日志泄露),也不能存 localStorage(跨 tab 共享导致复用);务必绑定 session 且单次有效(提交后立即失效)。
立即学习“前端免费学习笔记(深入)”;
补充防御:行为验证与速率限制的实际配置点
单纯验证码(CAPTCHA)体验差,但轻量级行为验证(如 invisible reCAPTCHA v3、hCaptcha)+ 后端速率控制,组合起来性价比最高。
- 对同一 IP 或同一
session_id,1 分钟内超过 3 次表单提交就返回429 Too Many Requests - reCAPTCHA v3 返回的
score建议阈值设为0.7以下时拒绝,而不是直接弹窗——避免干扰真实用户 - 关键动作(如注册、密码重置)必须强制校验,普通搜索或留言可放宽;别所有接口都套同一套规则
最容易被忽略的是:表单 action 地址本身不要暴露在 JS 变量或 API 响应里,否则爬虫能动态提取并批量请求。静态写死在 HTML 中,或由服务端渲染注入,更可控。



















