You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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接口),后端在响应中设置csrftoken Cookie,同时将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:18:40