Django中CSRF令牌验证异常问题排查(登录场景)
Django登录CSRF令牌验证失败的常见排查方向

模板令牌渲染错误
确认登录表单内部必须包含{% csrf_token %}标签,且标签处于<form>标签范围内。如果是AJAX提交登录请求,需手动在请求头中添加X-CSRFToken字段,值从浏览器的csrftokenCookie中获取。CSRF Cookie异常
打开浏览器开发者工具的Application面板,检查是否存在csrftokenCookie:- 若不存在,排查视图是否用
render函数渲染模板(Django 1.8+版本render默认携带RequestContext,手动用HttpResponse渲染会丢失上下文导致Cookie无法生成); - 若存在但请求未携带,检查Cookie的
Domain、Secure、HttpOnly配置是否与当前域名、访问协议匹配,避免浏览器拦截Cookie。
- 若不存在,排查视图是否用
请求格式不兼容
Django CSRF防护仅对POST/PUT/DELETE等修改类请求生效,且要求请求Content-Type为application/x-www-form-urlencoded、multipart/form-data或application/json:- 使用JSON格式提交时,必须在请求头中携带
X-CSRFToken; - 自定义Content-Type会导致Django跳过CSRF验证逻辑,或直接触发验证失败。
- 使用JSON格式提交时,必须在请求头中携带
令牌不匹配/失效
对比页面源码中csrfmiddlewaretoken的值与Cookie中csrftoken的值:- 若不一致,检查模板渲染时是否正确传递了上下文;
- 若服务器
settings.py中的SECRET_KEY被修改,之前生成的所有CSRF令牌都会直接失效。
中间件配置问题
确认settings.py的MIDDLEWARE列表中包含django.middleware.csrf.CsrfViewMiddleware,且顺序必须在django.contrib.sessions.middleware.SessionMiddleware之后,其他业务中间件之前。视图装饰器冲突
检查登录视图是否误加了@csrf_exempt装饰器(该装饰器会直接跳过CSRF验证),类视图需确保装饰器正确作用于dispatch方法而非单个请求方法。
内容的提问来源于stack exchange,提问作者Gouri krishna s
相关产品推荐
相关产品推荐

