Django注册/登录场景下CSRF Token的校验必要性及机制问询
Django中CSRF Token在注册/登录场景的作用与前后端分离校验机制
一、注册/登录视图是否需要校验CSRF Token?
需要。即便注册/登录是用户首次发起的请求,也必须校验CSRF Token——CSRF攻击不仅针对已登录用户的会话操作,也可能通过恶意页面诱导用户误提交注册/登录请求(比如构造虚假表单,让用户输入账号密码后提交到目标站点,虽不会直接窃取密码,但可能生成恶意账号或触发异常请求)。
Django的默认行为是:所有POST/PUT/DELETE等状态改变类的请求,都需要通过CSRF校验,除非你给视图添加@csrf_exempt装饰器主动豁免。比如django.contrib.auth中的LoginView、PasswordResetView等内置视图,都默认启用了@csrf_protect装饰器强制校验。
关于首次请求无Cookie的问题:当用户第一次访问登录/注册页面的GET请求时,Django会自动在响应中设置csrftoken Cookie;如果是Django模板渲染的页面,还会通过{% csrf_token %}生成隐藏的表单字段(值与Cookie中的Token关联)。用户提交POST请求时,浏览器会自动携带csrftoken Cookie,后端会校验表单字段(或请求头)中的Token与Cookie值是否匹配,完成校验。
二、前后端分离架构下的CSRF校验机制
前后端分离时,前端无法使用Django模板标签生成Token,可通过以下两种常见方式实现校验:
1. 主动获取Token并携带请求头
- 前端先发起GET请求(比如访问后端的
/api/get-csrf-token/接口,或直接请求首页这类无业务逻辑的GET接口),后端在响应中设置csrftokenCookie,同时将Token值返回在响应体中:# Django视图示例 from django.middleware.csrf import get_token from django.http import JsonResponse def get_csrf_token(request): csrf_token = get_token(request) return JsonResponse({'csrfToken': csrf_token}) - 前端存储该Token,后续发送POST/PUT/DELETE请求时,将Token放在
X-CSRFToken请求头中,同时确保请求携带Cookie(比如axios设置withCredentials: true)。后端会自动校验请求头的Token与Cookie中的值是否一致。
2. 利用前端框架自动读取Cookie
大部分前端HTTP库(如axios)支持自动从Cookie中读取CSRF Token并添加到请求头,无需手动获取:
// axios配置示例 import axios from 'axios'; axios.defaults.withCredentials = true; axios.defaults.xsrfCookieName = 'csrftoken'; axios.defaults.xsrfHeaderName = 'X-CSRFToken';
这种方式下,需确保跨域配置允许携带Cookie:
- Django端需安装并配置
django-cors-headers,设置CORS_ALLOW_CREDENTIALS = True,并在CORS_ALLOWED_ORIGINS中添加前端域名; - 前端请求需开启
withCredentials(如上例)。
内容的提问来源于stack exchange,提问作者Michael Mo
相关产品推荐
相关产品推荐

