如何验证Vue3前端向Django REST API发送POST请求的来源合法性?
验证Django REST API注册请求来源及防恶意刷库方案
Origin头的局限性
- 浏览器发起的跨域请求中,Origin头是浏览器自动生成且无法通过前端JS修改的,但对于curl、Postman等非浏览器工具,Origin头可以随意伪造。
- 仅靠Origin验证只能拦截部分低级跨域请求伪造,但完全挡不住脚本批量请求或Selenium模拟的自动化操作,因此单独使用Origin验证是不安全的。
有效防恶意注册的组合方案
1. 人机验证(核心手段)
- 集成图形验证码、滑动拼图、短信/邮箱验证码等:
- 图形验证码:可以用
django-simple-captcha库,前端在注册页面加载验证码,提交时将验证码内容一起发送,后端验证有效性。 - 短信/邮箱验证码:用户输入手机号/邮箱后先发送验证码,后端存储验证码有效期,注册时校验验证码是否正确且未过期。这种方式能有效区分真实用户和自动化脚本。
- 图形验证码:可以用
2. 请求速率限制
- 使用Django或DRF的速率限制机制:
- DRF内置了
AnonRateThrottle,可对匿名用户(未登录的注册请求)限制请求频率,比如设置为5/min(每分钟最多5次请求)。 - 第三方库
django-ratelimit可更灵活配置,比如按IP、手机号维度限制请求次数,即使脚本换IP,短时间内也无法发起大量请求。
- DRF内置了
3. CSRF防护(同域/带Cookie场景)
- 如果前端和后端同域,或跨域请求需携带Cookie,必须启用DRF的CSRF防护:
- 前端需从后端获取CSRF令牌,在请求头中携带
X-CSRFToken;后端通过csrf_exempt排除不需要防护的视图,其他视图自动校验令牌。 - 这能防止跨站请求伪造,但对直接调用API的脚本防护有限,需配合其他手段。
- 前端需从后端获取CSRF令牌,在请求头中携带
4. 前端行为校验(辅助手段)
- 添加隐藏字段:在注册表单中加入一个隐藏的
input,前端通过JS在用户点击提交按钮时才填充特定值(比如当前时间戳的哈希),后端校验该字段是否存在且符合规则。低级脚本如果未模拟这个JS交互,会被拦截。 - 校验页面停留时间:后端记录请求的时间戳,和前端提交的页面加载时间对比,过滤掉停留时间过短(比如小于2秒)的请求,排除快速批量提交的脚本。
5. 账号激活机制
- 用户注册后,必须通过邮箱或手机号验证才能激活账号:
- 后端生成激活链接或验证码,发送到用户填写的邮箱/手机号,只有验证通过后账号才能正常使用。即使脚本刷了大量注册请求,未激活的账号无法使用,降低恶意注册的实际影响。
内容的提问来源于stack exchange,提问作者8SIXSector
相关产品推荐
相关产品推荐

