csrf跨站请求伪造详解

【1】csrf跨站请求伪造的解释及解决方法

  • CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的网络攻击方式。
  • 攻击者通过诱导受害者访问恶意网站或点击恶意链接
    • 将恶意请求发送到目标网站上
    • 利用受害者在目标网站中已登录的身份来执行某些操作
    • 从而达到攻击的目的。
  • 举个例子
    • 假设受害者在一家网银网站上登录账户,然后继续浏览其他网页。
    • 同时,攻击者通过电子邮件等方式向受害者发送了一封包含恶意链接的邮件。
    • 当受害者点击该链接时,潜在的威胁就会变得非常现实。
    • 该链接指向一个由攻击者操纵的网站,该网站上的恶意代码会自动向网银网站发送一个请求,请求转账到攻击者的账户。
    • 由于受害者在网银网站中已经登录,所以该请求会被认为是合法的,这样攻击者就可以成功地进行转账操作。
  • 要保护自己免受CSRF攻击,网站开发者可以采取以下措施:
    • 使用CSRF令牌:
      • 在用户的请求中添加随机生成的令牌,并将该令牌保存在用户会话中。
      • 每次提交请求时都会验证该令牌,以确保请求是合法的。
    • 启用SameSite属性:
      • 将Cookie的SameSite属性设置为Strict或Lax,以限制跨站请求。
      • 这可以在一定程度上缓解CSRF攻击。
    • 严格验证请求来源:
      • 服务器端可以验证请求的来源是否为预期的网站域名
      • 例如检查HTTP Referer头部。
    • 使用验证码:
      • 在敏感操作(如转账、更改密码等)上使用验证码
      • 增加用户身份验证的防护。

【2】自定义csrf跨域请求伪造

  • 钓鱼网站
    • 搭建一个类似正规网站的页面
    • 用户点击网站链接,给某个用户打钱
    • 打钱的操作确确实实提交给了中国银行的系统,用户的钱也确实减少
    • 但是唯一不同的是,账户打钱的账户不是用户想要打钱的目标账户,变成了其他用户
  • 内部本质
    • 在钓鱼网站的页面针对对方账户,只给用户提供一个没有name属性的普通input框
    • 然后在内部隐藏一个已经写好带有name属性的input框
  • 如何避免上面的问题
    • csrf跨域请求伪造校验
      • 网站在给用户返回一个具有提交数据功能的页面的时候会给这个页面加一个唯一标识
      • 当这个页面后端发送post请求的时候,我们后端会先校验唯一标识
        • 如果成功则正常执行
        • 如果唯一标识不符合则拒绝连接(403 forbidden)

【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")

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

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

相关文章

华夏ERP信息泄露漏漏洞复现 [附POC]

文章目录 华夏ERP信息泄露漏漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 华夏ERP信息泄露漏漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#x…

好用的基于layui的免费开源后台模版layuimini

发现一个好用的后台模版 基于layui的免费开源后台模版layuimini layuimini - 基于Layui的后台管理系统前端模板 easyadmin开源项目 EasyAdmin是基于ThinkPHP6.0Layui的快速开发的后台管理系统。 演示站点 演示地址&#xff1a;跳转提示&#xff08;账号&#xff1a;admin&a…

Java实现—数据结构 1.初识集合框架

一、什么是集合框架 Java集合框架&#xff0c;又被称为容器&#xff0c;是定义在java.util包下的一组接口interfaces和其实现类classes 其主要表现为将多个元素element置于一个单元中&#xff0c; 集合框架是由若干个类组成的&#xff0c;每个类的背后就是一种数据结构&…

Jupyter Markdown 插入图片

首先截图 注意 这一步是关键的&#xff01;&#xff01; 它需要使用电脑自带的截图&#xff0c;用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制&#xff1a; 然后快捷键粘贴到jupyter里面&#xff0c;它会生成一段代码&#xff08;没有代码就是说截图形式不对&#xff09;&a…

【数据结构】线段树

目录 1.概述2.代码实现2.1.聚合操作——求和2.2.聚合操作——求和、求最小值、求最大值 3.应用4.与前缀和之间的区别 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;线段树 (Segment Tree) 是一种二叉树形数据结构&#xff…

linux 用户级别修改文件句柄数不生效

修改/etc/security/limits.conf 句柄数后发现无效需要执行以下操作。 1. vi /etc/ssh/sshd_config 2. StrictModes no/yes 3. UsePAM yes 4. service sshd restart 5. /etc/systemd/user.conf 新增DefaultLimitNOFILE65535 6. /etc/systemd/system.conf 新增DefaultLimitN…

logback-spring.xml的内容格式

目录 一、logback-spring.xml 二、Logback 中的三种日志文件类型 一、logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"10 seconds" ><!-- <statusListener…

C#使用WebSocket进行链接

C#使用WebSocket进行网络链接&#xff0c;和服务端搭建一个长连接进行通信。 有两种方式&#xff1a;串口方式&#xff08;SerialPort&#xff09;和网口方式&#xff08;Socket 包括&#xff1a;TcpClient和UdpClient&#xff09; 准备&#xff1a; 1.C#使用WebSocket的一种…

《100 Java Mistakes and How to Avoid Them》笔记 1

这几日在阅读 Manning 出版社的 《100 Java Mistakes and How to Avoid Them》, 其中列举的确实是一些容易带入到代码中的错误&#xff0c;不少还是通过代码 Review 或单元测试很难发现的问题。也有些看似很弱智&#xff0c;却可能是隐匿许久的定时炸弹&#xff0c;只等某一特定…

pandas教程:Advanced GroupBy Use 高级GroupBy用法

文章目录 12.2 Advanced GroupBy Use&#xff08;高级GroupBy用法&#xff09;1 Group Transforms and “Unwrapped” GroupBys&#xff08;组变换和无包装的GroupBy&#xff09;2 Grouped Time Resampling&#xff08;分组时间重采样&#xff09; 12.2 Advanced GroupBy Use&a…

图形编辑器开发:快捷键的管理

大家好&#xff0c;我是前端西瓜哥。 快捷键操作在图形编辑器中是很高频的操作&#xff0c;能让用户快速高效地执行特定命令&#xff0c;今天讲讲图形编辑器如果管理快捷键。 编辑器 github 地址&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://b…

计算机网络:网络层

0 本节主要内容 问题描述 解决思路 1 问题描述 两大问题&#xff08;重点&#xff0c;也是难点&#xff09;&#xff1a; 地址管理&#xff1b;路由选择。 1.1 子问题1&#xff1a;地址管理 网络上的这些主机和节点都需要使用一种规则来区分&#xff0c;就相当于是一种身…

说说过量 tcp pure ack 的利弊

tcp 的 ack 实在太多了&#xff0c;如果互联网上 80% 报文是 tcp&#xff0c;那么其中 1/3 的报文都是 ack&#xff0c;此前写过几篇短文&#xff0c;比如 丢弃一些 pure ack 和 注入或利用 pure ack。 简单说&#xff0c;tcp 依靠 ack 提供 self-clock&#xff0c;发送 data …

ARM异常模型

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买【加群】ARM/TEE…

Docker和Kubernetes:区别与优势对比

在现代软件开发和部署中&#xff0c;Docker和Kubernetes是两个备受关注的技术。本文将对Docker和Kubernetes进行比较&#xff0c;探讨它们的区别和各自的优势。 引言 在过去的几年中&#xff0c;容器技术得到了迅速的发展&#xff0c;并且在现代软件交付和部署中扮演着越来越重…

LVS-DR实验

实验前准备 DR服务器&#xff1a;192.168.188.11 192.168.188.15 NFS服务器&#xff1a;192.168.188.14 Web服务器1&#xff1a;192.168.188.12 Web服务器2&#xff1a;192.168.188.13 Vip&#xff1a;192.168.188.188 客户端&#xff1a;192.168.188.200 配置负载均衡调度…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

Unity EventSystem的一些理解和使用

Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一&#xff0c;可以用于捕捉和分发各种事件&#xff0c;例如点击、拖拽、按键、射线等。 常用的属性和方法有以下这些&#xff1a; 属性&#xff1a; current: 获取当前的EventSystem实例。…

HuggingFace学习笔记--datasets的使用

目录 1--datasets的使用 1-1--加载数据集 1-2--查看数据集 1-3--打乱和排序数据集 1-4--选择和筛选数据集 1-5--划分数据集 1-6--修改数据集 1-7--导出数据集 1--datasets的使用 1-1--加载数据集 代码&#xff1a; from datasets import load_dataset, load_from_di…

C#中的TaskFactory

在C#中&#xff0c;TaskFactory是一个用于创建异步任务的类。它提供了一种方便的方式来创建Task对象&#xff0c;这些对象表示可以异步执行的操作。TaskFactory类位于System.Threading.Tasks命名空间下。 要使用TaskFactory&#xff0c;您需要导入相应的命名空间&#xff1a; …