Django框架之csrf跨站请求
目录
一、csrf跨站请求伪造详解
二、csrf跨域请求伪造
【1】正常服务端
【2】钓鱼服务端
三、csrf校验
【介绍】
form表单中进行csrf校验:
【1】form表单如何校验
【2】ajax如何校验
四、csrf相关装饰器
【1】csrf_protect装饰器:
【2】csrf_exempt装饰器:
【3】FBV中使用上述装饰器
【4】CBV中使用上述装饰器
(1) csrf_protect
(2) csrf_exempt方法
一、csrf跨站请求伪造详解
- CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
- 攻击者通过诱导受害者访问恶意网站或点击恶意链接
- 将恶意请求发送到目标网站上
- 利用受害者在目标网站中已登录的身份来执行某些操作
- 从而达到攻击的目的。
- 举个例子
- 假设受害者在一家网银网站上登录账户,然后继续浏览其他网页。
- 同时,攻击者通过电子邮件等方式向受害者发送了一封包含恶意链接的邮件。
- 当受害者点击该链接时,潜在的威胁就会变得非常现实。
- 该链接指向一个由攻击者操纵的网站,该网站上的恶意代码会自动向网银网站发送一个请求,请求转账到攻击者的账户。
- 由于受害者在网银网站中已经登录,所以该请求会被认为是合法的,这样攻击者就可以成功地进行转账操作。
- 要保护自己免受CSRF攻击,网站开发者可以采取以下措施:
- 使用CSRF令牌:
- 在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。
- 每次提交请求时都会验证该令牌,以确保请求是合法的。
- 启用SameSite属性:
- 将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。
- 这可以在一定程度上缓解CSRF攻击。
- 严格验证请求来源:
- 服务器端可以验证请求的来源是否为预期的网站域名
- 例如检查HTTP Referer头部。
- 使用验证码:
- 在敏感操作(如转账、更改密码等)上使用验证码
- 增加用户身份验证的防护。
- 使用CSRF令牌:
二、csrf跨域请求伪造
- 钓鱼网站
- 搭建一个类似正规网站的页面
- 用户点击网站链接,给某个用户打钱
- 打钱的操作确确实实提交给了中国银行的系统,用户的钱也确实减少
- 但是唯一不同的是,账户打钱的账户不是用户想要打钱的目标账户,变成了其他用户
- 内部本质
- 在钓鱼网站的页面针对对方账户,只给用户提供一个没有name属性的普通input框
- 然后在内部隐藏一个已经写好带有name属性的input框
- 如何避免上面的问题
- csrf跨域请求伪造校验
- 网站在给用户返回一个具有提交数据功能的页面的时候会给这个页面加一个唯一标识
- 当这个页面后端发送post请求的时候,我们后端会先校验唯一标识
- 如果成功则正常执行
- 如果唯一标识不符合则拒绝连接(403 forbidden)
- csrf跨域请求伪造校验
【1】正常服务端
- 前端
<h1>这是正规的网站</h1><form action="" method="post"><p>当前账户 :>>>> <input type="text" name="start_user"></p><p>目标账户 :>>>> <input type="text" name="end_user"></p><p>转账金额 :>>>> <input type="text" name="money"></p><input type="submit">
</form>
- 后端
def transform_normal(request):if request.method == "POST":user_start = request.POST.get("start_user")user_end = request.POST.get("end_user")money = request.POST.get("money")return HttpResponse(f"当前账户 :>>> {user_start} 向目标用户 :>>> {user_end} 转账了 :>>> {money}")return render(request, 'transform_normal.html')
【2】钓鱼服务端
- 前端
<h1>这是钓鱼的网站</h1><form action="http://127.0.0.1:8000/transform_normal/" method="post"><p>当前账户 :>>>> <input type="text" name="start_user" ></p><p>目标账户 :>>>> <input type="text"></p><p><input type="text" name="end_user" value="Hopes" style="display: none"></p><p>转账金额 :>>>> <input type="text" name="money"></p><input type="submit">
</form>
- 后端
def transform_normal(request):if request.method == "POST":user_start = request.POST.get("start_user")user_end = request.POST.get("end_user")money = request.POST.get("money")return HttpResponse(f"当前账户 :>>> {user_start} 向目标用户 :>>> {user_end} 转账了 :>>> {money}")return render(request, 'transform_normal.html')
三、csrf校验
【介绍】
- csrf校验是一种用于防止跨站请求伪造(Cross-Site Request Forgery)攻击的安全措施
form表单中进行csrf校验:
添加CSRF Token字段:
- 在form表单中添加一个隐藏字段,用于存储CSRF Token的值。
- 后端服务器在渲染表单时生成一个CSRF Token,并将其存储在会话中或者以其他方式关联到当前用户。
- 当用户提交表单时,前端将CSRF Token的值包含在请求中。
- 后端在验证表单数据时,检查请求中的CSRF Token是否与存储的Token匹配,如果不匹配,则拒绝请求。
设置Cookie:
- 后端服务器在渲染表单时,在客户端设置一个包含随机生成的CSRF Token的Cookie。
- 当用户提交表单时,表单数据会被一同发送到服务器,并自动包含该Cookie。
- 后端在验证表单数据时,检查请求中的CSRF Token是否与Cookie中的值匹配,如果不匹配,则拒绝请求。
双重Cookie校验:
- 后端服务器在渲染表单时,在Cookie中设置一个随机生成的CSRF Token,并将其存储在会话中或以其他方式关联到当前用户。
- 当用户提交表单时,表单数据会被一同发送到服务器,请求头或请求参数中携带一个包含CSRF Token的自定义字段。
- 后端在验证表单数据时,同时检查请求中的CSRF Token和Cookie中的值是否匹配,如果不匹配,则拒绝请求。
【1】form表单如何校验
- 在form表单上面加上
csrf_token
{% csrf_token %}
<form action="" method="post"><p>username:<input type="text" name="username"></p><p>transfer_user<input type="password" name="password"></p><p>money<input type="text" name="money"></p><input type="submit">
</form>
- 在页面标签中会自动出现一个标签
<input type="hidden" name="csrfmiddlewaretoken" value="zQaNPZsy1tVmLdqC7GIDOOOfR7yT9YfO58lJ5yrjZfTw2edZTrVYUllOVMnkwXKe">
【2】ajax如何校验
- 方式一
- 利用标签查找获取页面上的随机字符串
- 键必须叫
csrfmiddlewaretoken
<button id="b1">ajax请求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (1) 利用标签查找获取页面上的随机字符串data: {"username": "dream","csrfmiddlewaretoken":$('[csrfmiddlewaretoken]').val()},success: function () {}})})
</script>
- 方式二
- 利用模板语法进行快捷引入
<button id="b1">ajax请求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (2) 利用模板语法提供的快捷书写data: {"username": "dream", "csrfmiddlewaretoken": "{{ csrf_token }}"},success: function () {}})})
</script>
- 方式三
- 定义一个js文件并引入
- 导入该配置文件之前,需要先导入jQuery,因为这个配置文件内的内容是基于jQuery来实现的
function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var 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;
}
var csrftoken = getCookie('csrftoken');function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});
<button id="b1">ajax请求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (3) 定义外部js文件并引入到本地data: {"username": "dream"},success: function () {}})})
</script>
四、csrf相关装饰器
- 网站整体部分校验csrf,部分不校验csrf
- 网站整体全部校验csrf,部分不校验csrf
【1】csrf_protect装饰器:
- csrf_protect装饰器用于需要进行CSRF保护的视图函数或类视图。
- 当一个视图被csrf_protect装饰器修饰时,Django会对该视图接收到的所有POST、PUT、DELETE等非安全HTTP方法的请求进行CSRF校验。
- 如果请求中没有有效的CSRF令牌或令牌校验失败,Django将返回403 Forbidden响应。
【2】csrf_exempt装饰器:
- csrf_exempt装饰器用于不需要进行CSRF保护的视图函数或类视图。
- 当一个视图被csrf_exempt装饰器修饰时,Django将不会对该视图接收到的任何请求进行CSRF校验。
- 这个装饰器主要用于一些特殊情况,比如与第三方系统进行集成、开放API接口等。
【3】FBV中使用上述装饰器
from django.views.decorators.csrf import csrf_protect, csrf_exempt
'''
csrf_protect 需要校验
csrf_exempt 忽视校验
'''
-
当我们没有注释掉
csrf校验中间件的时候,可以在函数头上加上@csrf_exempt忽视校验 -
当我们注释掉
csrf校验中间件的时候,可以在函数头上加上@csrf_protect强制启动校验
【4】CBV中使用上述装饰器
from django.views.decorators.csrf import csrf_protect, csrf_exempt
'''
csrf_protect 需要校验针对 csrf_protect 符合之前的装饰器的三种用法
csrf_exempt 忽视校验针对 csrf_exempt 只能给 dispatch 方法加才有效
'''
(1) csrf_protect
- (1) 方式一
- 给指定方法加
@method_decorator
- 给指定方法加
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decoratorclass MyCsrf(View):def get(self, request):return HttpResponse("get")@method_decorator(csrf_protect)def post(self, request):return HttpResponse("post")
- (2) 方式二
- 给类加然后指明方法
@method_decorator
- 给类加然后指明方法
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decorator@method_decorator(csrf_protect)
class MyCsrf(View):def get(self, request):return HttpResponse("get")def post(self, request):return HttpResponse("post")
- (3) 方式三
- 重写
dispatch方法
- 重写
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decoratorclass MyCsrf(View):@method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs):return super(MyCsrf, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse("get")def post(self, request):return HttpResponse("post")
(2) csrf_exempt方法
- 只有重写
dispatch方法 有效
from django.views import View
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decoratorclass MyCsrf(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(MyCsrf, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse("get")def post(self, request):return HttpResponse("post")相关文章:
Django框架之csrf跨站请求
目录 一、csrf跨站请求伪造详解 二、csrf跨域请求伪造 【1】正常服务端 【2】钓鱼服务端 三、csrf校验 【介绍】 form表单中进行csrf校验: 【1】form表单如何校验 【2】ajax如何校验 四、csrf相关装饰器 【1】csrf_protect装饰器: 【…...
[系统移植] 移植主线Buildroot(2023.02-rc3)到RK3399
文章目录 一、编译环境二、Git环境三、克隆源代码四、编译源代码五、烧录固件六、系统启动一、编译环境 PC 机用的是 Ubuntu 18.04,执行以下命令安装必要工具: sudo apt install gcc build-essential bison flex gettext tcl sharutils libncurses-dev zlib1g-dev \ exube…...
自动语音识别 支持86种语言 Dragon Professional 16 Crack
从个体从业者到全球组织,文档密集型行业的专业人士长期以来一直依靠 Dragon 语音识别来更快、更高效地创建高质量文档,减少管理开销,以便他们能够专注于客户。了解 Dragon Professional v16 如何通过单一解决方案提高标准,为各个业…...
i社为什么不出游戏了?
I社,即国际知名的游戏公司,近来为何鲜有新游问世?曾经风靡一时的游戏开发者,如今为何陷入了沉寂?这其中的种种原因,值得我们深入剖析。 首先,I社近期的沉寂可能与其内部管理层的调整和战略规划…...
Harmony开发 eTs公共样式抽取
Harmony系统开发使用eTs开发过程中对于样式相同且重复使用的样式可以抽取成公共样式循环利用,类似于android的style样式。 import router from ohos.router import cryptoFramework from ohos.security.cryptoFramework; import prompt from system.prompt class L…...
Java中的方法
在Java中,方法是一个重要的概念,它用于组织和执行可重复使用的代码块。本文将详细介绍Java中方法的概念、定义和使用方法,以及一些常见的编程技巧和注意事项。 一、方法的概念 在Java中,方法是用来执行特定任务的代码块。它封装了…...
存算一体还是存算分离?谈谈数据库基础设施的架构选择
从一则用户案例说起 某金融用户问,数据库用服务器本地盘性能好还是外置存储好?直觉上,本地盘路径短性能应该更好。然而测试结果却出乎意料:同等中等并发压力,混合随机读写模型,服务器本地SSD盘合计4万 IOPS…...
go模版引擎的使用~~
go模板语句 以下是一些go语言模板引擎的一些简单知识和使用 基础语法 重要!!!: 模板在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页࿰…...
我们为什么要进行敏捷开发培训
敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调团队合作、客户需求和适应变化。进行敏捷开发培训其实有多种原因,我整理了一些,可以作为参考: 理解敏捷原则和实践: 敏捷开发不仅是一种方法论,更是一…...
【算法萌新闯力扣】:合并两个有序链表
力扣题目:合并两个有序链表 开篇 今天是备战蓝桥杯的第24天及算法村开营第2天。根据算法村的讲义,来刷链表的相关题目。今天要分享的是合并两个有序链表。 题目链接: 21.合并两个有序链表 题目描述 代码思路 通过创建一个新链表,然后遍历…...
BEV+Transformer架构加速“上车”,智能驾驶市场变革开启
BEVTransformer成为了高阶智能驾驶领域最为火热的技术趋势。 近日,在2023年广州车展期间,不少车企及智能驾驶厂商都发布了BEVTransformer方案。其中,极越01已经实现了“BEVTransformer”的“纯视觉”方案的量产,成为国内唯一量产…...
Java中的jvm——面试题+答案(JVM的一些高级概念、调优技巧、垃圾回收算法等)——第13期
当涉及到Java虚拟机(JVM)时,面试官可能涉及更深入的问题,涵盖性能调优、垃圾回收算法、类加载机制等方面。 什么是类加载机制?请解释类加载的过程。 答案: 类加载是将类的.class文件加载到内存中的过程&…...
Android修行手册-ViewPager定制页面切换以及实现原理剖析
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…...
Mycat实现读写分离
Mycat实现读写分离 Mycat支持MySQL主从复制状态绑定的读写分离机制。这里实现的也是基于MySQL主从复制的读写分离。 MySQL主从复制配置 首先要配置MySQL的主从复制,这里配置的是一主一次从。可以参考下面的文章。 https://blog.csdn.net/wsb_2526/article/detail…...
Ceph----CephFS文件系统的使用:详细实践过程实战版
CephFS 介绍 是一个基于 ceph 集群 且兼容 POSIX 标准的文件系统。 创建 cephfs 文件系统时 需要在 ceph 集群中添加 mds 服务,该服务 负责处理 POSIX 文件系统中的 metadata 部分, 实际的数据部分交由 ceph 集群中的 OSD 处理。 cephfs 支持以内核模块…...
python tkinter 使用(七)
python tkinter 使用(七) 本篇文章主要讲下tkinter 中的message 控件. Message控件可以用于在窗口中显示一段文本消息. 以下是个简单的例子: #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/11/24 上午11:38 .Email:Describe: "…...
17. Python 数据库操作之MySQL和SQLite实例
目录 1. 简介2. 使用PyMySQL2. 使用SQLite 1. 简介 数据库种类繁多,每种数据库的对外接口实现各不相同,为了方便对数据库进行统一的操作,大部分编程语言都提供了标准化的数据库接口,用户不需要了解每种数据的接口实现细节&#x…...
Kafka-TopicPartition
Kafka主题与分区 主题与分区 topic & partition,是Kafka两个核心的概念,也是Kafka的基本组织单元。 主题作为消息的归类,可以再细分为一个或多个分区,分区也可以看作对消息的二次归类。 分区的划分为kafka提供了可伸缩性、水…...
英特尔工作站:助力专业用户实现高效创作
原创 | 文 BFT机器人 英特尔工作站是由全球知名的英特尔公司设计和开发的一款计算平台。英特尔在工作站处理器领域将其产品分为性能型和移动型两类,它的诞生旨在满足专业用户在科学、工程、设计等领域对高性能计算的需求。英特尔工作站配备了最新的英特尔处理器、大…...
软件工程期末复习(选择+填空+判断)
文章目录 软件工程期末复习一、 选择题 软件工程期末复习 一、 选择题 1.“软件危机”的表现不包括:(c) A、软件产品不能按期交付 B、用户对“已完成的”软件产品时常不满意 C、程序员越来越供不应求 D、软件项目难以管理,维护困…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
