Backend - Django CSRF 跨域请求伪造

目录

一、CSRF & XSS

(一)CSRF

1. 含义

2. 攻击原理

(1)浏览器特点

(2)攻击方式

(二)XSS

1. 含义

2. 攻击原理

(三)二者区别

二、Django Ajax CSRF 防御

(一)令牌同步模式(Synchronizer Token Pattern,简称STP)

1. 原理

2. 设置验证

(二)双重cookie验证(Double Submit Cookie)

1. 原理

2. 设置验证

(三)X-Csrf-Token验证(Cookie-to-header token)

1. 原理

2. 设置验证

三、设定 CSRF 验证

(一)settings.py

(二)base.html

1. 针对 ajax 请求,body 里添加{% csrf_token %}

2. 针对 form 表单,form 表单里添加{% csrf_token %}

(三)JS

1. 针对 双重cookie验证

(1)方法1

(2)方法2

2. 针对 X-Csrf-Token验证(Cookie-to-header token)

(1)方法1

3. 针对所有模式的综合验证

(1)写入位置

(2)引入顺序

四、关闭 CSRF 防御功能

1. 方法1:全局禁用

2. 方法2:局部禁用

五、Django CSRF 的控制台Error

(一)Reason given for failure: CSRF cookie not set.

1. 原因

2. 解决

(二)CSRF verification failed. Request aborted.

1. 原因

(1)原因1:csrf_token 过期

(2)原因2:请求头的 csrf_token 与session存储的token不匹配

(3)原因3:模板里没有csrfmiddlewaretoken


一、CSRF & XSS

(一)CSRF

1. 含义

        跨站请求伪造(Cross-site Request Forgery )。

2. 攻击原理

(1)浏览器特点

同个浏览器上,无论是目标网站A还是其他网站B,发送对目标网站A的HTTP请求,都会自动带上目标网站A的cookie,发送给服务端。

(2)攻击方式

同个浏览器上,当用户登录了目标网站(已登录状态),再进入攻击网站,攻击网站发送对目标网站的HTTP请求,则会自动带上“已登录的目标网站”的cookie,就可以进行攻击服务端。

(二)XSS

1. 含义

跨站脚本攻击(Cross-Site Scripting,为了和 CSS 区分,则简称 XSS)。

2. 攻击原理

在目标网站上注入恶意脚本进行攻击。(攻击者提交恶意代码,浏览器再执行恶意代码,篡改了网页)

(三)二者区别

CSRF 是 HTTP 问题,XSS 是代码注入问题。

CSRF需登录目标网站,XSS不用登录。

二、Django Ajax CSRF 防御

(一)令牌同步模式(Synchronizer Token Pattern,简称STP)

1. 原理

(1)找到数据库Session的session_csrftoken参数。成功登录网站后,后端随机产生一个csrftoken值,并把该值保存在数据库Session参数中。

(2)找到网页模板的隐藏csrfmiddlewaretoken名的标签。初始化某界面时,前端模板会根据{% csrf_token %}生成一个隐藏的name='csrfmiddlewaretoken'的input标签,存放后端随机生成的csrftoken值。

(3)用户进行 ajax post 请求。post请求时,csrfmiddlewaretoken值会一并放在请求数据(或头信息)中,发送给后端。后端会根据前端csrfmiddlewaretoken的 value值、和服务端数据库 public.django_session 表的 session_csrftoken参数值,判断两个csrf_token解密后的值是否一致。

(4)一致则正常访问,不一致则拒绝访问。

2. 设置验证

在第三点中。

(二)双重cookie验证(Double Submit Cookie)

1. 原理

(1)找到浏览器cookie的csrftoken。成功登录网站后,整个浏览器中Cookie的csrftoken属性,存放后端随机生成的csrftoken值。

(2)找到网页模板的隐藏csrfmiddlewaretoken名的标签。初始化某界面时,前端模板会根据{% csrf_token %}生成一个隐藏的 name='csrfmiddlewaretoken' 的input标签,存放后端随机生成的csrftoken值。

(3)用户进行 ajax post 请求。post请求时,csrfmiddlewaretoken值会一并放在请求数据(或头信息)中,发送给后端。后端会根据前端csrfmiddlewaretoken的 value值、和浏览器Cookie的csrftoken值,判断两个csrf_token解密后的值是否一致。

(4)一致则正常访问,不一致则拒绝访问。

2. 设置验证

在第三点中。

(三)X-Csrf-Token验证(Cookie-to-header token)

1. 原理

(1)确保同源政策。

(2)系统主要使用JavaScript进行交互。(因为恶意攻击无法读取cookie值并复制到HTTP请求头中)

(3)将cookie上的token复制到HTTP请求头中。

(4)后端验证HTTP请求头中token的存在和完整性。

(5)X-Csrf-Token头存在且完整,则正常访问,否则拒绝访问。

2. 设置验证

在第三点中。

三、设定 CSRF 验证

以下主要针对基于 django 使用 ajax 发送 post 请求时的验证。

(一)settings.py

        MIDDLEWARE里添加'django.middleware.csrf.CsrfViewMiddleware'  # 设置CSRF检测功能

(二)base.html

1. 针对 ajax 请求,body 里添加{% csrf_token %}

例如:

<body id="body">{% csrf_token %}<div>{% block content %} {% endblock %}</div>
</body>

渲染后:

<body id="body"><input type="hidden" name="csrfmiddlewaretoken" value="vUAPUcghecxAGlraGaFGbikXz3SOPcWtmMtk8o1UQ1PpYYAhxg2cAiAaLyQ9HEY9" /><div>插入的子模板</div>
</body>

2. 针对 form 表单,form 表单里添加{% csrf_token %}

因为若在 base.html 中加入 {% csrf_token %},是不在 form 表单的范围内。所以需要在 form 表单里添加。

例如:

<form action="http://127.0.0.1:8080/myApp/test" method=POST>{% csrf_token %}<input type="submit"/>
</form>

(三)JS

1. 针对 双重cookie验证

(1)方法1

        后端将csrftoken传到前端(放置在隐藏标签里),发送post请求时,请求数据data中加上csrftoken,一起发送给后端。

        在base.html中的script里写上。

$.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
(2)方法2

        后端将csrftoken传到前端(放置在隐藏标签里),发送post请求时,请求数据data中加上csrftoken。

        在base.html中的script里写上。

$.ajaxSetup({data: {csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()},
});

2. 针对 X-Csrf-Token验证(Cookie-to-header token)

(1)方法1

        cookie中存在csrftoken,请求头headers中加上csrftoken。

        在base.html中的script里写上。

        前提:

                ① 引入jquery-3.1.1.min.js和jquery.cookie.js

                ② 引入顺序:jQuery库文件必须先于cookie文件。

$.ajaxSetup({headers:{ "X-CSRFtoken":$.cookie("csrftoken")},
});

3. 针对所有模式的综合验证

(1)写入位置

        前面两个验证的所有方法只能写在html中,不能写到外部js文件。因为{{ csrf_token }} 渲染在模板上,若以外部文件引入,则不能执行。

        以下代码可以写在外部js文件里,并在 base.html 里引入该js文件。

(2)引入顺序

        该 js 文件的引入顺序必须在 jquery.js 文件之后。

/*** 【 Cross Site Request Forgery TOKEN 】*  Forbidden 403 - CSRF check with an AJAX POST request in Django.*/
jQuery(document).ajaxSend(function (event, xhr, settings) {function getCookie(name) {let cookieValue = null;if (document.cookie && document.cookie !== '') {let cookies = document.cookie.split(';');for (let i = 0; i < cookies.length; i++) {let cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;}function sameOrigin(url) {// url could be relative or scheme relative or absolutelet host = document.location.host; // host + portlet protocol = document.location.protocol;let sr_origin = '//' + host;let origin = protocol + sr_origin;// Allow absolute or scheme relative URLs to same originreturn (url === origin || url.slice(0, origin.length + 1) === origin + '/') ||(url === sr_origin || url.slice(0, sr_origin.length + 1) === sr_origin + '/') ||// or any other URL that isn't scheme relative or absolute i.e relative.!(/^(\/\/|http:|https:).*/.test(url));}function safeMethod(method) {return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}if (!safeMethod(settings.type) && sameOrigin(settings.url)) {xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));}
});

四、关闭 CSRF 防御功能

不推荐关闭 CSRF 防御功能,因为取消了 CSRF 防御保护。

1. 方法1:全局禁用

        settings.py中,注释掉'django.middleware.csrf.CsrfViewMiddleware'

2. 方法2:局部禁用

        views.py中,导入from django.views.decorators.csrf import csrf_exempt;

        并给要处理post数据的函数补充@csrf_exempt(post函数有request参数)。

五、Django CSRF 的控制台 Error

(一)Reason given for failure: CSRF cookie not set.

1. 原因

        django 中使用 jquery ajax post 数据出现 403 错误。

        即,settings设置了Django CSRF检测功能(防止跨站请求伪造),需要在django发送post请求时进行字符串验证,但还没有设置CSRF cookie。

2. 解决

(1)第一种:关闭 CSRF 检测功能

(2)第二种:设定 CSRF 验证

(这两种方式在前面第三点中已介绍)

(二)CSRF verification failed. Request aborted.

1. 原因

(1)原因1:csrf_token 过期

        解决:重新登录(若还未写前端登录,则admin登录)

(2)原因2:请求头的 csrf_token 与session存储的token不匹配

        解决:清除浏览器缓存; 重新登录

(3)原因3:模板里没有csrfmiddlewaretoken

        解决:模板中(或表单内)添加 {% csrf_token %} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript基础(二)—— 运算符、表达式与语句(if、switch、循环)

学习目标&#xff1a; 掌握常见运算符&#xff0c;为程序“能思考”做准备 掌握分支语句&#xff0c;让程序具备判断能力 掌握循环语句&#xff0c;让程序具备重复执行能力 一、运算符 1. 赋值运算符 对变量进行赋值的运算符&#xff0c;能够使用赋值运算符简化代码。 …

推荐系统|概要03_AB测试

文章目录 A/B测试问题流量不够用解决方案——分层实验 Holdout 机制 A/B测试 其中小流量是指对部分的用户先尝试改进的算法模型&#xff0c;而非全部。若为全部&#xff0c;如果算法模型存在问题&#xff0c;可能会导致用户体验差&#xff0c;导致用户流失&#xff0c;而小流量…

Kubernetes实战(二十二)-Pod时区修改

一般国内引用的基础镜像时区都是 UTC 时区&#xff0c;在此基础上&#xff0c;如果去容器查看日志的话就会发现和本地时间对不上&#xff0c;会导致一些问题出现&#xff0c;比如输出的日志时间和当前不一致&#xff0c;所以一般都会把操作系统或容器里的时区替换为 Shanghai。…

深入探究iframe:网页嵌入的魔法盒子(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DATAX改造支持geometry类型数据同步

数据库使用postgresql安装了postgis插件存储了geometry空间数据&#xff0c;想使用datax做数据同步&#xff0c;但datax本身不支持geometry类型数据&#xff0c;如何改造呢&#xff1f; 1.首先下载已改造支持geometry类型的datax引擎&#xff0c;下载地址 https://download.c…

Jmeter性能测试: Jmeter 5.6.3 分布式部署

目录 一、实验 1.环境 2.jmeter 配置 slave 代理压测机 3.jmeter配置master控制器压测机 4.启动slave从节点检查 5.启动master主节点检查 6.运行jmeter 7.观察jmeter-server主从节点变化 二、问题 1.jmeter 中间请求和响应乱码 一、实验 1.环境 &#xff08;1&#…

oracle数仓rac两个节点查询耗时不一致问题处理

问题描述 数据库节点1查询比节点2查询慢。现场操作应用发现发现同一sql语句在节点2上只要2分钟左右&#xff0c;在节点1&#xff0c;该条sql执行要超过30分钟。 处理过程 根据问题&#xff0c;初步判断是由于错误的执行计划&#xff0c;导致性能问题&#xff0c;但实际上对两…

编程流程图

对于复杂流程&#xff0c;我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下&#xff1a; processOn&#xff1a; 这个是我之前 一直的选择&#xff0c;他可以画上面的这些&#xff0c;流程图&#xff0c;网页操作&#xff0c;但是他不是免费的&#xff0c;查过…

MySQL常用命令集

1、数据库操作 1.1、显示数据库列表 show databases; 1.2、显示库中的数据表 use mysql; show tables; 1.3、显示数据表的结构 describe 表名; 1.4、建库 create database 库名; 1.5、建表 use 库名&#xff1b; create table 表名 (字段设定列表)&#xff1b; 1.…

leetcode LCP 24. 数字游戏【等价转换+对顶堆维护中位数】

原题链接&#xff1a;LCP 24. 数字游戏 题目描述&#xff1a; 小扣在秋日市集入口处发现了一个数字游戏。主办方共有 N 个计数器&#xff0c;计数器编号为 0 ~ N-1。每个计数器上分别显示了一个数字&#xff0c;小扣按计数器编号升序将所显示的数字记于数组 nums。每个计数器…

JavaScript事件冒泡和捕获

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 事件传播是JavaScript中非常重要的一个概念,它描述了从嵌套元素到祖先…

【C++干货铺】哈希结构在C++中的应用

目录 unordered系列关联式容器 unordered_map unordered_map的接口说明 1.unordered_map的构造 2. unordered_map的容量 3. unordered_map的迭代器 4. unordered_map的元素访问 5. unordered_map的查询 6. unordered_map的修改操作 7. unordered_map的桶操作 底层结构 …

mysql+node.js+html+js完整扫雷项目

一.下载 可以直接下载绑定资源&#xff0c; 也可以访问&#xff1a;克隆仓库&#xff1a;mine_clearance: mysqlnode.jshtmljs完整扫雷项目 (gitee.com) 二.运行sql数据文件 将mysql数据文件导入到本地 先在本地localhost里创建数据库 mine_clearance&#xff0c; 然后如图&…

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…

微软给Windows 11增添了一个由AI支持的‘Voice Clarity’功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

linux搭建jupyter

查看虚拟环境 conda info --envs进入虚拟环境 conda activate my_env pip install jupyter pip install ipykernel1. jupyter notebook启动 1.1 创建临时jupyter notebook任务 jupyter notebook --ip0.0.0.0 --no-browser --allow-root --notebook-dir/home/xxx1.2 jupyter…

共用体与枚举法,链表的学习

结构体注意事项&#xff1a; 1.结构体类型可以定义在main函数里面&#xff0c;但是此时的作用域就被限定在该函数中 2.结构体的的的定义的形式&#xff1a;a.先定义类型&#xff0c;后定义变量-----struct stu s b.定义类型的同时&#xff0c;定义了变量&#xff1a;struct…

Notion 开源替代品:兼容 Miro 绘图 | 开源日报 No.162

toeverything/AFFiNE Stars: 25.6k License: NOASSERTION AFFiNE 是下一代知识库&#xff0c;将规划、排序和创建集于一身。它是一个注重隐私、开源、可定制且即插即用的替代方案&#xff0c;可以与 Notion 和 Miro 相媲美。主要功能和优势包括&#xff1a; 超融合&#xff1…

轻松使用python将PDF转换为图片(成功)

使用PyMuPDF&#xff08;fitz&#xff09;将PDF转换为图片 在处理PDF文件时&#xff0c;我们经常需要将PDF页面转换为图片格式&#xff0c;以便于在网页、文档或应用程序中显示。Python提供了多种方式来实现这一需求&#xff0c;本文将介绍如何使用PyMuPDF&#xff08;也称为f…

本地部署GeoServe服务并结合内网穿透实现任意浏览器远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…