首页 > 其他分享 >DRF 前后端分离项目如何解决CSRF 数据交互

DRF 前后端分离项目如何解决CSRF 数据交互

时间:2024-07-07 23:32:46浏览次数:15  
标签:axios const 请求 data token CSRF 交互 DRF

★ 背景说明

在Django REST framework (DRF) 前后端分离项目中,解决CSRF问题通常有以下几种方法:
1. 禁用CSRF验证,但这会降低安全性。(不推荐)
2. 使用csrftoken cookie
3. 在前端每次 POST、PUT 或 DELETE 请求前先发起一个GET请求(GET请求不需要经过CSRF检查)获取CSRFToken并将响应中的CSRFToken添加到新的请求头中。(推荐)

★ 解决思路

  • 方案二

    • 步骤一: 在返回给浏览器(客户端)的响应中设置 csrftoken相关的 Cookie信息(需要保证csrftoken在有效期内)

    • 步骤二:在发送请求前获取最新的CSRF token,并且在前端的每次请求中都包含了这个token

      // 首先,获取CSRF token
      function getCookie(name) {
          let cookieValue = null;
          if (document.cookie && document.cookie !== '') {
              const cookies = document.cookie.split(';');
              for (let i = 0; i < cookies.length; i++) {
                  const cookie = cookies[i].trim();
                  // 假设CSRF cookie名为csrftoken
                  if (cookie.substring(0, name.length + 1) === (name + '=')) {
                      cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                      break;
                  }
              }
          }
          return cookieValue;
      }
      const csrftoken = getCookie('csrftoken');
       
      // 然后,配置axios全局默认值
      axios.defaults.headers.common['X-CSRFToken'] = csrftoken;
      axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
       
      // 之后,所有通过axios发送的请求都会自动携带CSRF token
      
  • 方案三

    • 步骤一: 使用请求拦截器在每次 POST、PUT 或 DELETE 请求中前先发起一个GET请求获取CSRF token 添加到请求头中

      // frontend.js
      
      import axios from 'axios';
      
      const api = axios.create({
          baseURL: '/api/',
          headers: {
              'Content-Type': 'application/json'
          }
      });
      
      api.interceptors.request.use(async config => {
          const { method } = config;
          if (method === 'post' || method === 'put' || method === 'delete') {
              const csrfToken = await getCSRFToken();
              config.headers['X-CSRF-Token'] = csrfToken;
          }
          return config;
      });
      
      async function getCSRFToken() {
          const response = await axios.get('/get-csrf-token/');
          return response.data.csrfToken;
      }
      
      async function postData(url = '', data = {}) {
          const response = await api.post(url, data);
          return response.data;
      }
      
      postData('data/', { key: 'value' })
          .then(data => {
              console.log(data);
      });
      
      
    • 步骤二: 在Django后端中使用 Django REST framework 编写了类视图,实现返回csrftoken的逻辑

      • 视图views.py

        # views.py
        from rest_framework.views import APIView
        from rest_framework.response import Response
        from rest_framework import status
        from django.middleware.csrf import get_token
        
        class CSRFTokenView(APIView):
            def get(self, request):
                csrf_token = get_token(request)
                return Response({'csrfToken': csrf_token})
        
            def post(self, request):
                # 处理 POST 请求的逻辑
                return Response({'message': 'Data received'}, status=status.HTTP_200_OK)
        
        
      • 路由urls.py

        # urls.py
        
        from django.urls import path
        from .views import CSRFTokenView
        
        urlpatterns = [
            path('get-csrf-token/', CSRFTokenView.as_view(), name='get_csrf_token'),
            path('api/data/', CSRFTokenView.as_view(), name='post_data'),
        ]
        
      • 代码说明:

        在这个完整的示例中,前端代码使用 axios 创建了一个名为 api 的实例,并通过请求拦截器自动添加 CSRF token 到请求头中。后端使用 Django REST framework 编写了类视图 CSRFTokenView,其中包含了获取 CSRF token 和处理 POST 请求的逻辑。最后,在 urls.py 中设置了两个路由,分别映射到获取 CSRF token 和处理 POST 请求的视图函数。
        

标签:axios,const,请求,data,token,CSRF,交互,DRF
From: https://www.cnblogs.com/cs-songbai/p/18289072

相关文章

  • 前端JS特效第22集:html5音乐旋律自定义交互特效
    html5音乐旋律自定义交互特效,先来看看效果:部分核心的代码如下(全部代码在文章末尾):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>ChimeTime™</title><linkrel="stylesheet"href="css/style.css......
  • 【Axure基础教程】交互样式的设置
    交互样式可以提前设置样式效果,当元件在浏览器中预览并遇到特定的状态时(如:鼠标悬停、鼠标按下、选中、禁用、获取焦点等),会触发对应状态的样式,从而实现在不同状态下触发不同的交互样式的效果交互样式设置框分为不同的类型,包括鼠标悬停、鼠标按下、选中、禁用、获取焦点,每一......
  • 列车-轨道-桥梁交互仿真研究(Matlab代码实现)
    ......
  • CSRF攻击与修复
    基本原理受害者登录a.com,并保留了登录凭证(Cookie)。攻击者引诱受害者访问了b.com。b.com向a.com发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。a.com以受害者的名义执......
  • vue+openlayers之几何图形交互绘制基础与实践
    文章目录1.实现效果2.实现步骤3.示例页面代码3.基本几何图形绘制的关键代码1.实现效果绘制点、线、多边形、圆、正方形、长方形2.实现步骤引用openlayers开发库。加载天地图wmts瓦片地图。在页面上添加几何图形绘制的功能按钮,使用下拉列表(select)设置几何图形绘制......
  • csrf跨站请求,钓鱼网站实现示例,CSRF校验,CSRF相关装饰器,Auth模块,扩展Auth表
    ⅠDjango框架之csrf跨站请求【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而......
  • 【SPIE独立出版】第三届智能机械与人机交互技术学术会议(IHCIT 2024,7月27)
    由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT2024)将定于2024年7月27日于中国杭州召开。大会面向基础与前沿、学科与产业,旨在将“人工智能”、“智能系统”和“人机交互”等学......
  • 在Windows操作系统中,与文件系统进行交互主要通过一系列的API函数来实现,这些函数包括底
    操作文件系统API与操作系统的文件系统进行交互,涉及到底层的文件系统操作和文件属性管理。不同的操作系统提供了不同的API和机制来执行这些操作,但基本的原理和流程大致相似。文件系统API的基本操作1.文件时间戳(创建时间、修改时间、访问时间)创建时间(CreationTime):表示文件被创......
  • 微软预计年底实现实时语音界面;硅基智能开源 AI 数字人交互平台 Duix丨 RTE 开发者日报
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • Unreal模型云渲染方案、发布到Web页面以及与Vue交互
    一、Unreal模型云渲染方案Unreal模型的云渲染方案主要基于服务器进行图像渲染,并通过视频流的方式推送给浏览器。以下是云渲染的详细步骤:工程上传:打开客户端网盘入口,添加工程所在路径。点击一键上传,选择Xneo21区域,自动传输工程目录内相关资产。任务提交:在网盘客户端中......