csrf跨站请求伪造详解
【1】csrf跨站请求伪造的解释及解决方法
- CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
- 攻击者通过诱导受害者访问恶意网站或点击恶意链接
- 将恶意请求发送到目标网站上
- 利用受害者在目标网站中已登录的身份来执行某些操作
- 从而达到攻击的目的。
- 举个例子
- 假设受害者在一家网银网站上登录账户,然后继续浏览其他网页。
- 同时,攻击者通过电子邮件等方式向受害者发送了一封包含恶意链接的邮件。
- 当受害者点击该链接时,潜在的威胁就会变得非常现实。
- 该链接指向一个由攻击者操纵的网站,该网站上的恶意代码会自动向网银网站发送一个请求,请求转账到攻击者的账户。
- 由于受害者在网银网站中已经登录,所以该请求会被认为是合法的,这样攻击者就可以成功地进行转账操作。
- 要保护自己免受CSRF攻击,网站开发者可以采取以下措施:
- 使用CSRF令牌:
- 在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。
- 每次提交请求时都会验证该令牌,以确保请求是合法的。
- 启用SameSite属性:
- 将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。
- 这可以在一定程度上缓解CSRF攻击。
- 严格验证请求来源:
- 服务器端可以验证请求的来源是否为预期的网站域名
- 例如检查HTTP Referer头部。
- 使用验证码:
- 在敏感操作(如转账、更改密码等)上使用验证码
- 增加用户身份验证的防护。
- 使用CSRF令牌:
【2】自定义csrf跨域请求伪造
- 钓鱼网站
- 搭建一个类似正规网站的页面
- 用户点击网站链接,给某个用户打钱
- 打钱的操作确确实实提交给了中国银行的系统,用户的钱也确实减少
- 但是唯一不同的是,账户打钱的账户不是用户想要打钱的目标账户,变成了其他用户
- 内部本质
- 在钓鱼网站的页面针对对方账户,只给用户提供一个没有name属性的普通input框
- 然后在内部隐藏一个已经写好带有name属性的input框
- 如何避免上面的问题
- csrf跨域请求伪造校验
- 网站在给用户返回一个具有提交数据功能的页面的时候会给这个页面加一个唯一标识
- 当这个页面后端发送post请求的时候,我们后端会先校验唯一标识
- 如果成功则正常执行
- 如果唯一标识不符合则拒绝连接(403 forbidden)
- csrf跨域请求伪造校验
【2.1】创建两个服务端
【2.1.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.1.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')
【3】csrf校验
【3.1】csrf校验是什么?
csrf校验:是一种防止跨站请求伪造攻击的安全措施
【3.2】csrf校验的三种方式
【3.2.1】添加CSRF Token字段
- 在form表单中添加一个隐藏字段,用于存储CSRF Token的值
- 后端服务器在渲染表单时生成一个CSRF Token,并将其存储在会话中或者以其它方式关联到当前用户
- 当用户提交表单时目前短将CSRF Token的值包含在请求中
- 后端在验证表单数据时,检查请求中的CSFR Token是否与存储的Token匹配,如果不匹配,则拒绝请求
【3.2.2】设置Cookie
- 后端服务器在渲染表单时,在客户端设置一个包含随机生成的CSRF Token的Cookie
- 当用户提交表单时,表单数据会被异同发送到服务器,并自动包含该Cookie
- 后端在验证表单数据时,检查请求中的CSRF Token是否与Cookie中的值匹配,如果不匹配,则拒绝请求
【3.2.3】双重Cookie校验
- 后端服务器在渲染表单时,在Cookie中设置一个随机生成的CSRF Token,并将其存储在会话中或以其它方式关联到当前用户
- 当用户提交表单时,表单数据会被一同发送到服务器,请求头或请求参数中携带一个包含CSRF Token的自定义字段
- 后端在验证表单数据时,同时检查请求中的CSRF Token和Cookie中的值是否匹配,如果不匹配,则拒绝请求
【3.2.4】form表单校验
- 在form表单上面加上csrf_token
<form action="" method="post">
{% csrf_token %}<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标签
<input type="hidden" name="csrfmiddlewaretoken" value="zQaNPZsy1tVmLdqC7GIDOOOfR7yT9YfO58lJ5yrjZfTw2edZTrVYUllOVMnkwXKe">//value是随机生成的一个串
【3.2.5】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);}}
});
Cross Site Request Forgery protection | Django documentation | Django (djangoproject.com)
<button id="b1">ajax请求提交</button><script>$("#b1").click(function () {$.ajax({url: '',type: 'post',// (3) 定义外部js文件并引入到本地data: {"username": "dream"},success: function () {}})})
</script>
【4】csrf相关装饰器
- 【1】网站整体部分校验csrf,部分不校验csrf
- 【2】网站整体全部校验csrf,部分不校验csrf
【4.1】csrf_protect装饰器
- csrf_protect装饰器用于需要进行CSRF保护的视图函数或类视图
- 当一个视图被csrf_protect装饰器修饰时,Django会对该视图接收到的所有POST、PUT、DELETE等非安全HTTP方法的请求进行CSRF校验
- 如果请求中没有有效的CSRF令牌或令牌校验失败,Django将返回403 Forbidden响应
【4.2】csrf_exempt装饰器
- csrf_exempt装饰器用于不需要进行CSRF保护的视图函数或类视图
- 当一个视图被csrf_exempt装饰器修饰时,Django将不会对该视图接收到的任何请求进行CSRF校验
- 这个装饰器主要用于一些特殊情况,比如与第三方系统进行集成,开放API接口等
【4.3】FBV中使用上述装饰器
from django.views.decorators.csrf import csrf_protect, csrf_exempt
'''
csrf_protect 需要校验
csrf_exempt 忽视校验
'''
【4.4】CBV中使用上述装饰器
from django.views.decorators.csrf import csrf_protect, csrf_exempt
'''
csrf_protect 需要校验针对 csrf_protect 符合之前的装饰器的三种用法
csrf_exempt 忽视校验针对 csrf_exempt 只能给 dispatch 方法加才有效
'''
【4.4.1】csrf_protect方法
- 方式一
- 给指定方法加@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")
- 方式二
- 给类加然后指明方法@method_decorator(csrf_protect)
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")
- 方式三
- 重写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")
【4.4.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")
相关文章:
csrf跨站请求伪造详解
【1】csrf跨站请求伪造的解释及解决方法 CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接 将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而…...
GitLab的个人仓库转移到团队仓库
文章目录 一、Gitlab权限二、转移2.1、编辑个人仓库2.2、Transfer project2.3、切换Namespace2.4、确认修改 一、Gitlab权限 Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner Guest:可以创建issue、发表评论,不能读写…...
Linux:Ubuntu实现远程登陆
1、查看sshd服务是否存在 Ubuntu默认是没有安装sshd服务的,所以,无法远程登陆。 检查22端口是否存在 netstat -anp 该命令执行后,查看不到22端口的进程。 如果netstat无法使用,我们需要安装一下netstat服务 sudo apt-get install…...
Unity中Shader的Standard材质解析(二)
文章目录 前言一、我们对 Standard 的 PBR 的 GI 进行解析1、我们先创建一个PBR的.cginc文件,用于整理用到的函数2、然后在Standard的Shader中引用该cginc文件 二、依次整理函数到该cginc文件中我们来看一下PBR中GI的镜面反射做了些什么 二、最终代码.cginc代码&…...
【Python 训练营】N_5 斐波那契数列
题目 输出斐波那契数列 分析 斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。 在数学上,费波那契数列是以递归的方法来定义ÿ…...
x-www-form-urlencoded的含义解释,getReader()和getParameter()的区别
1、x-www-form-urlencoded x-www-form-urlencoded是一种编码格式,它是一种常见的编码方式,用于在HTTP请求中 传输表单数据 。在这种编码方式下,表单数据被编码为URL格式,然后作为请求体(payload)发送。 需要…...
python每日一题——3最长连续序列
题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出…...
什么?Postman也能测WebSocket接口了?
01 WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接…...
requests库的学习(详细篇)
一、request库的安装 requests属于第三方库,Python不内置,因此需要我们手动安装。 pip3 install requests...
postgreSQL如何快速查询大表数据量
文章目录 场景方案结果 场景 我有一个非常大的表,估计几百万或者几千万。 我开始使用了 select count(*) from my_table_javapub 方式,查询非常慢。 如何解决??? 方案 如果你需要更快地获取表中的行数,…...
微信小程序内嵌h5页面,实现动态设置顶部标题的功能
一、需求描述 使用HBuilder X作为开发工具,vue作为开发语言,开发微信小程序。微信小程序页面内嵌h5页面,即<web-view></web-view>标签。通过设置不同url连接地址,设置不同的标题。 二、失败做法 页面A嵌入h5页面&a…...
手机IP地址会随位置变化吗
当今社会,手机已经成为人们生活中必不可少的工具之一。然而,许多人对于手机的IP地址是否会随位置的变化而改变感到困惑。在本文中,虎观代理小二二将揭开这个迷团,深入讨论手机IP地址的变化情况,并为您提供详细解答。 首…...
为什么考完软考中级还要考高级呢?
为什么考完软考中级还要考高级呢?软考高级含金量大吗? 根据《计算机技术与软件专业技术资格(水平)考试暂行规定》第十条: “通过考试并获得相应级别计算机专业技术资格(水平)证书的人员,表明其已具备从事…...
03.实现
实现 条款26:尽可能延后变量定义式的出现时间 条款27:尽量少做转型动作 条款28:避免返回handles指向对象内部成分 在C中,handles是指一个指向对象的指针或引用,用于访问该对象的成员函数或成员变量。 而条款28所说…...
可视化大屏时代的到来:智慧城市管理的新思路
随着科技的不断发展,智能芯片作为一种新型的电子元件,被广泛应用于各个领域,其中智慧芯片可视化大屏是一种重要的应用形式。 一、智慧芯片可视化大屏的优势 智慧芯片可视化大屏是一种将智能芯片与大屏幕显示技术相结合的产品,山海…...
Hibernate的三种状态
1.瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,他并未对数据库中的数据有任何的关联,此时java对象的状态为瞬时状态,Session对于瞬时状态的java对象是一无所知的,当对象不再被其他对象引用时…...
React 中 useContext 的用法与性能问题详解
文章目录 一、useContext 是什么?二、useContext 使用场景三、使用步骤1.使用 createContext 创建一个 Context2.使用 Provider 提供值3.使用 useContext 访问 Context完整示例 四、Provider 的 value 类型五、如何在子组件中修改 context 的数据?六、使…...
流程图是什么,用什么软件做?
在工作流程中,经常会遇到需要图形化呈现整个流程的情况。流程图就是一种一目了然的图形化表现方式,便于人们理解、沟通和管理整个流程。 1.Visio Visio是一款微软公司的图表软件,可以用于创建各种类型的流程图、组织结构图、网络图、平面图…...
Linux 家目录和根目录
摘要: 在 Linux 操作系统中,家目录和根目录是两个非常重要的概念。它们是 Linux 文件系统中的两个关键节点,为用户和系统进程提供存储、管理和访问文件和目录的接口。本文旨在深入探讨和理解这两个目录的结构、功能和使用方式,同时…...
js前端跨屏效果
效果: 三个球 源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>三个球</title> </h…...
Docker+TensorFlow Lite田间推理加速指南:单树摄像头推理延迟从1.2s降至186ms的7步调优法
第一章:DockerTensorFlow Lite田间推理加速指南:单树摄像头推理延迟从1.2s降至186ms的7步调优法在部署于边缘设备(如Jetson Nano)的果园单树识别系统中,原始Docker容器内运行的TensorFlow Lite模型推理耗时达1200ms。通…...
实战复盘:用Passware Kit Forensic搞定盘古石杯NAS取证,离线提取Windows密码真就这么简单?
数字取证竞赛实战:Passware Kit与Hashcat的离线密码提取艺术 在CTF和数字取证竞赛的战场上,离线密码提取往往是决定胜负的关键环节。2023年盘古石杯等赛事中,参赛者频繁面对从Windows系统、加密容器到iOS备份等多种场景的密码破解挑战。本文将…...
日志丢失、格式混乱、排查耗时>2小时?27天重构Docker日志架构,实现100%可追溯、零盲区监控
第一章:Docker日志架构重构的痛点与目标在大规模容器化生产环境中,Docker默认的日志驱动(json-file)暴露出显著瓶颈:日志文件无自动轮转、磁盘空间不可控、多容器日志检索低效、缺乏结构化字段支持,且无法与…...
前端包管理工具对比
前端包管理工具对比:选择最适合你的利器 在现代前端开发中,包管理工具是不可或缺的一环。无论是管理项目依赖、提升开发效率,还是优化构建流程,选择合适的工具都至关重要。目前主流的前端包管理工具包括npm、Yarn和pnpmÿ…...
用Python模拟兔子和羊的“地盘争夺战”:手把手教你实现Lotka-Volterra竞争模型
用Python模拟兔子和羊的“地盘争夺战”:手把手教你实现Lotka-Volterra竞争模型 生态学中的物种竞争关系一直是研究者关注的焦点。想象一片广袤的草原,兔子和羊作为主要的食草动物,它们之间存在着微妙的竞争关系——争夺有限的草资源。这种竞争…...
WPS-Zotero插件:5分钟实现跨平台文献引用自动化
WPS-Zotero插件:5分钟实现跨平台文献引用自动化 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 还在为学术论文的文献引用而头疼吗?WPS-Zotero插件是…...
告别状态管理混乱:Svelte 5条件绑定与响应式状态实战指南
告别状态管理混乱:Svelte 5条件绑定与响应式状态实战指南 【免费下载链接】svelte web development for the rest of us 项目地址: https://gitcode.com/GitHub_Trending/sv/svelte Svelte 5作为一款革新性的前端框架,以其独特的编译时响应式系统…...
暗黑2重制版终极自动化脚本Botty:5步配置实现24小时高效MF
暗黑2重制版终极自动化脚本Botty:5步配置实现24小时高效MF 【免费下载链接】botty D2R Pixel Bot 项目地址: https://gitcode.com/gh_mirrors/bo/botty 还在为重复刷怪感到枯燥乏味吗?Botty作为专业的暗黑2重制版像素级自动化脚本,能够…...
工业级YOLO检测数据处理:C#上位机存储+报表导出全方案(含SQLite+Excel+PDF+7×24小时稳定运行)
摘要 在工业视觉检测系统中,YOLO模型的推理性能只是基础,检测结果的可靠存储、规范管理与标准化报表导出才是决定系统能否真正落地的关键。很多项目只关注模型精度,却因数据处理方案简陋导致数据丢失、追溯困难、报表不规范等问题,最终无法通过企业验收。 本文基于C# Win…...
AI批量翻译txt文档工具:功能详解与使用指南
对于需要处理大量外文资料的用户来说,批量翻译文档是个常见需求。本文介绍一款基于AI的文档翻译工具,包含完整功能解析和操作指南。 工具能做什么 一句话总结:用AI批量翻译文件夹内的txt、md、srt文档,支持多语言、术语表、翻译缓…...
