文章目录

  • Django CSRF
    • 什么是CSRF?
    • Django CSRF
      • Django CSRF 中间件
      • Django,Ajax提交csrf_token处理
      • Django 设置 cookie 中的 csrftoken
    • Django 去掉项目的CSRF验证
    • Django彻底禁用CSRF检查(去掉django rest framework强制的csrf检查)
      • "detail": "CSRF Failed: CSRF cookie not set."
    • 防范CSRF的主要手段
      • token防御的整体思路
  • Django前后端分离csrf token获取方式
    • 参考

Django CSRF

浏览器在发送请求的时候,会自动带上当前域名对应的cookie内容,发送给服务端,不管这个请求是来源A网站还是其它网站,只要请求的是A网站的链接,就会带上A网站的cookie。

浏览器的同源策略并不能阻止CSRF攻击。

什么是CSRF?

CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造。

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

Django CSRF

django为用户实现防止跨站请求伪造的功能,通过中间件django.middleware.csrf.CsrfViewMiddleware 来完成。

对于django中设置防跨站请求伪造功能分为全局和局部。

  • 全局:中间件 django.middleware.csrf.CsrfViewMiddleware
    过滤所有post的请求。是为全局的,需要遵循下面
    在html中加上{% csrf_token %}
    views:的返回用render方法

  • 局部:
    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件
    设置(局部)也可以通过装饰器来设定局部的CSRF。(指定某些遵循csrf)
    @csrf_protect
    在html中加上{% csrf_token %}
    views:的返回用render

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

Django下的CSRF预防机制:
django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,

注意:Django默认对所有的POST请求都进行csrftoken验证,若验证失败则403错误侍候。

Django CSRF 中间件

Django为了防止跨站请求伪造,即csrf攻击,提供了CsrfViewMiddleware中间件来防御csrf攻击。Django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,并把这个 token 放在 cookie 里

然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。如果POST请求中没有token随机字符串,则返回403拒绝服务。

  • 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
  • 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
  • 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden。
  • 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

服务器进行csrf防御校验的时候,是拿用户http请求体中的token参数值和cookie中的csrftoken值进行比对。如果值一样了,操作才被允许执行。

Django,Ajax提交csrf_token处理

前端:
在进行post提交时,获取Cookie当中的csrftoken并在请求中添加X-CSRFToken请求头, 该请求头的数据就是csrftoken。通过$.ajaxSetup方法设置AJAX请求的默认参数选项, 在每次ajax的POST请求时,添加X-CSRFToken请求头

Django 设置 cookie 中的 csrftoken

一般我们认为cookie里的csrftoken是由csrftoken middleware所设置的,事实确实如此,但也不完全是。

Django 去掉项目的CSRF验证


注释掉此段代码即可,但是不推荐此方式,将导致我们的网站完全无法防止CSRF攻击。

Django彻底禁用CSRF检查(去掉django rest framework强制的csrf检查)

Django彻底禁用CSRF检查
参考URL: https://www.cnblogs.com/besharp/archive/2012/07/04/2576303.html
去掉django rest framework强制的csrf检查
参考URL: https://blog.csdn.net/dale_dede/article/details/47058393

问题背景:
有的django-rest-framework 是强制进行csrf的,有的不是,有的是,具体不清楚。
因此调式开发过程中,可能需要, 写个中间件把这个强制csrf去掉,并在 settings.Middleware 里注册该中间件

1.创建一个middleware.py,定义一个 DisableCSRF类:

# -*- coding: utf-8 -*-
import logging
import datetime
from django.utils.deprecation import MiddlewareMixinlogger = logging.getLogger('django.request')class DisableCSRF(MiddlewareMixin):def process_request(self, request):setattr(request, '_dont_enforce_csrf_checks', True)
  1. 修改settings.py,添加自定义的middleware并放到Django自带的CSRF系列middleware之前:
MIDDLEWARE_CLASSES = (
'<YOUR_APP_NAME>.middleware.DisableCSRF',
...
)
  1. 确保删除自定义Templates中的 {% csrf_token % }标签

“detail”: “CSRF Failed: CSRF cookie not set.”

一.报错信息

“detail”: “CSRF Failed: CSRF cookie not set.”

二.错误原因

因为在SessionAuthentication中强制使用CSRF Token。如果未传递有效的CSRF令牌,则会引发403错误。

三.解决办法

你可以自定义中间件来禁止CSRF Token验证

防范CSRF的主要手段

防范CSRF的主要手段是识别请求者的身份,主要有以下几种方式:

  • 添加令牌(token)
  • 验证码
  • 检查请求头中的Referer

令牌和验证都具有一次消费性的特征,因此在原理上一致的,但是验证码是一种糟糕的用户体验,不是必要的情况下不要轻易使用验证码,目前很多网站的做法是如果在短时间内多次提交一个表单未获得成功后才要求提供验证码,这样会获得较好的用户体验。

token防御的整体思路

CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。

token防御的整体思路是:
第一步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;
第二步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;
第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

Django前后端分离csrf token获取方式

django前后端分离_CSRF解决方案
参考URL: https://blog.csdn.net/qq_42223962/article/details/106891068
Django前后端分离csrf token获取方式
参考URL: https://www.jb51.net/article/202894.htm

  1. 首先在view视图定义,向后端请求token的函数
from django.middleware.csrf import get_token# /api/gettoken  这个是地址 url路由的配置就是这个,我下面就不介绍怎么配置路由了,比较简单
class GetTokenView(View):# 向服务器请求tokendef get(self, request):token = get_token(request)return JsonResponse({'res':0, "token":token})
  1. 前端js编写
$(document).ready(function(){// 在页面加载的时候,先向服务器获取token$.ajax({url:"http://127.0.0.1:8000/api/gettoken",dataType: "json",type: "GET",success:function (req) {if ("0" == req.res){csrftoken = req.token;  // 接受上边视图函数返回的token,保存到全局变量中document.cookie = 'csrftoken=' + req.token;  // token设置到cookie中}else {alert("获取token失败")  // 可以不要,是用来我们测试的}}})
})

参考

Django + DRF 接口访问 CSRF Failed: CSRF cookie not set 怎么办,教你解决
参考URL: https://zhuanlan.zhihu.com/p/485706948

Django CSRF(什么是CSRF?)\Django前后端分离csrf token获取方式相关推荐

  1. 前后端分离使用 Token 登录解决方案

    前后端分离使用 Token 登录解决方案:https://juejin.im/post/5b7ea1366fb9a01a0b319612 转载于:https://www.cnblogs.com/byd ...

  2. SSM+JWT实现前后端分离的token验证

    SSM+JWT实现前后端分离的token验证 前言 什么是JWT 基于Token的验证流程 JWT的Token实现 后端部分 前端部分 测试 项目完整地址 前言 以前写的web项目都是没有前后端分离的 ...

  3. springboot前后端分离项目MultipartFile获取前端传的file为null问题

    [问题描述] springboot+vue 前后端分离项目,在对接上传文件功能时,一直显示文件为空. [分析] 查找了很多博客,解决方法五花八门,但原因应该还是 springboot自带的org.sp ...

  4. 阿里云视频上传视频获取进度条问题(使用session方案,获取进度一直为0的解决方案)补充:前后端分离项目中获取进度解决方案

    1.场景描述: 之前用阿里云上传视频,前端反应上传视频经常出现获取视频url失败问题.但是接口我测过很多遍都是没有问题的.后台这边提供了一个视频上传的接口返回一个videoId,还提供了一个根据vid ...

  5. java不同项目加token访问_利用JWT实现前后端分离的Token验证

    写在前面:本篇文章的代码图片展示均使用carbon绘制,图片质量很高,如果图片过小可以点击查看原图.项目实例前端部分使用基于Angular的Ionic框架(TypeScript),使用Spring B ...

  6. 前后端分离项目token怎么验证_微信端前后端分离开发中token验证和数据的获取...

    微信端前后分离开发中,授权认证,获取token和openid是必不可少的一步. 我们的思路是,每次调用接口前,判断cookie里面是否有token和openid,没有的话判断url参数中是否存在,没有 ...

  7. spring boot+shiro+vue前后端分离时,获取不到session

    登录成功后,获取用户对应的菜单树,结果报错session失效. controller: @ApiOperation("用户登录") @ApiImplicitParams({@Api ...

  8. 前后端分离项目token怎么验证_前后端分离,获取token,验证登陆是否失效

    public classJwtUtils {/*** 密钥*/ private static final String SECRET="xxxx";/*** 默认字段key:exp ...

  9. django集成vue,实现前后端分离开发

    目前,前后端分离的开发方式越发常见,已成为主要开发方式,那么django作为一个python快速开发中小型web端最常见的框架,django虽然也有自己前端模板,但是毕竟不是很好,而且写在一起,也不符 ...

最新文章

  1. flask执行python程序_Flask app后如何执行代码(应用程序运行)开始
  2. pythonのgevent同步异步区别
  3. 从架构到代码:软件开发最新趋势解析
  4. Windows—JDK安装与环境变量配置
  5. (七)python3 只需3小时带你轻松入门——List与dict
  6. 《计算机网络》第三章:数据链路层(The Data Link Layer)
  7. MYSQL 中 SQL 常用操作
  8. C语言和设计模式(之模板模式)
  9. java调用方法出现i 2a_性能-Java方法调用与使用变量
  10. JSTL获取session中的值
  11. 进入到一个新的产品,如何开展测试工作
  12. 【面经】来啦!百度凤巢算法面经
  13. Spark取出(Key,Value)型数据中Value值为前n条数据
  14. 优思学院|朱兰,质量改进的先驱者
  15. 将word背景设成淡绿色方法
  16. 美团套餐榜、商家榜数据抓取
  17. 云桌面和PC之间,存在什么差别
  18. 华为设备常用软件包名
  19. 【CSDN】01-文章编辑方式
  20. vuerouter路由的理解

热门文章

  1. Android悬浮球及全局返回功能的实现
  2. python中的Queue
  3. nexus 增加代理仓库 无法搜到snapshot的jar包 解决方法
  4. 【数据库】期末复习:SQL语句、关系代数的运算、范式的定义和判断、求最小函数依赖集、ER图转关系模式
  5. everything增强神器,文档搜索效率何止翻倍!
  6. 无分电器计算机控制的检查方法,无分电器点火系统检修方案.doc
  7. Android退出APP 并杀掉相关的所有进程
  8. java三角形的画法
  9. 计算机课自我介绍二百字,自我介绍作文200个字
  10. C++ 内存中堆栈讲解