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跨域请求伪造

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

【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相关装饰器

  1. 网站整体部分校验csrf,部分不校验csrf
  2. 网站整体全部校验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")

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

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

相关文章

使用VUE3实现简单颜色盘,吸管组件,useEyeDropper和<input type=“color“ />的使用

1.使用vueuse中的useEyeDropper来实现滴管的功能和使用input中的type"color"属性来实现颜色盘 效果&#xff1a; 图标触发吸管 input触发颜色盘 组件代码部分 &#xff1a;<dropper> ---- vueuse使用 <template><div class"sRGBHexWrap fbc…

【Python百宝箱】第三维度的魔法:探索Python游戏世界

Python在游戏开发中的魔力 前言 游戏开发一直是计算机科学中最引人入胜和具有挑战性的领域之一。随着技术的不断进步&#xff0c;开发者们寻找着更快、更灵活的工具来实现他们的创意。在这个探索的过程中&#xff0c;Python以其简洁、易学和强大的特性成为了游戏开发的热门选…

C#每天复习一个重要小知识day4:枚举的概念/申明/使用

目录 1.枚举的概念&#xff1a; 2.申明枚举和申明枚举变量&#xff1a; 申明枚举语法&#xff1a; 申明枚举变量语法&#xff1a; 1.枚举的概念&#xff1a; 枚举是什么&#xff1f;枚举是一个比较特别的存在&#xff0c;它是一个命名的整形常量的集合&#xff0c;一般用它…

Flume采集Kafka并把数据sink到OSS

安装环境 Java环境, 略 (Flume依赖Java)Flume下载, 略Scala环境, 略 (Kafka依赖Scala)Kafak下载, 略Hadoop下载, 略 (不需要启动, 写OSS依赖) 配置Hadoop 下载JindoSDK(连接OSS依赖), 下载地址Github 解压后配置环境变量 export JINDOSDK_HOME/usr/lib/jindosdk-x.x.x expo…

AWS CLI和EKSCTL的客户端设置

文章目录 小结过程安装AWS CLI安装EKSCTL在两个Kubernetes Cluster之间切换 参考 小结 在Linux环境中对AWS CLI和EKSCTL的客户端进行了设置。 过程 安装AWS CLI 使用以下指令安装&#xff1a; curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"…

Qt实现绘制自定义形状

先创建一个继承自QWidget的控件&#xff1a; class MyPainterWidget:public QWidget 重写各种鼠标方法&#xff1a; protected:void paintEvent(QPaintEvent *) override;void mousePressEvent(QMouseEvent *e) override; //按下void mouseMoveEvent(QMouseEvent *e) …

Xposed hook失败的原因

最近对Xposed的比较感兴趣&#xff0c;于是照着网上的给的例子做了一个Xposed模块&#xff0c;但是在安卓模拟器上死活不生效&#xff0c;最后研究发现了两个问题导致&#xff1a; 1、XposedBridgeAPI-89.jar 需要放到项目的lib目录下&#xff0c;而不是libs目录 2、XposedBr…

HEVC-SCC rgb file input

关键字 csc allocateCSCBuffer&#xff08;&#xff09;-> m_apcPicYuvCSC xCheckRDCostIntraCSC():更简单&#xff0c; enum ACTRDTestTypes { ACT_TWO_CLR 0, //two color space ACT_TRAN_CLR 1, //transformed color space ACT_ORG_CL…

补充:如何提高selenium的运行速度?

已经通读该专栏文章的同学,或许对UI自动化测试有了一定的掌握,细心的同学肯定会发现一个问题,当用例量达到一定程度时,对于整体用例的执行速度肯定不会很满意。除了应用多线程运行用例的方式加快速度,有没有其他的方法呢? 今天告诉大家,方法是有的!也是本人新学的。即…

[PyTorch][chapter 66][强化学习-值函数近似]

前言 现实强化学习任务面临的状态空间往往是连续的,无穷多个。 这里主要针对这种连续的状态空间处理。后面DQN 也是这种处理思路。 目录&#xff1a; 1&#xff1a; 原理 2&#xff1a; 梯度更新 3&#xff1a; target 和 预测值 4 流程 一 原理 强化学习最重要的是得到 …

c++版本opencv计算灰度图像的轮廓点

代码 #include<iostream> #include<opencv.hpp>int main() {std::string imgPath("D:\\prostate_run\\result_US_20230804_141531\\mask\\us\\104.bmp");cv::Mat imgGray cv::imread(imgPath, 0);cv::Mat kernel cv::getStructuringElement(cv::MORPH…

任意分圆环下的 RLWE:如何产生正确的噪声分布

参考文献&#xff1a; [Con09] Conrad K. The different ideal[J]. Expository papers/Lecture notes. Available at: http://www.math.uconn.edu/∼kconrad/blurbs/gradnumthy/different.pdf, 2009.[LPR10] Lyubashevsky V, Peikert C, Regev O. On ideal lattices and learn…

thinkphp6生成PDF自动换行

composer安装 composer require tecnickcom/tcpdf 示例 use TCPDF;public function info($university,$performance,$grade,$major){//获取到当前域名$domain request()->domain();//实例化$pdf new TCPDF(P, mm, A4, true, UTF-8, false);// 设置文档信息$pdf->SetCr…

Azkaban极简使用文档

登录 地址: http://服务器ip:8081/, 用户名密码默认都是azkaban 构建项目流程 添加Project 编写工作流文件 在本机新建文件夹如test, 创建一个flow20.project 文件, 内容 azkaban-flow-version: 2.0(固定步骤)编写flow文件, 例如一个最基础的实例 test1.flow nodes:- name…

JAVA序列化和反序列化

JAVA序列化和反序列化 文章目录 JAVA序列化和反序列化序列化什么是序列化&#xff1f;为什么要进行序列化?如何将对线进行序列化具体实现过程 完整代码 序列化 什么是序列化&#xff1f; 就是将对象转化为字节的过程 为什么要进行序列化? 让数据更高效的传输让数据更好的…

Vue中的$nextTick

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue中的$nextTick 目录 &#x1f40b;Vue中的$nextTick有什么作用&#xff1f; &#x1f40b;一、…

socket can中是如何根据 结构体can_bittiming_const中的字段 计算bitrate的?

在 SocketCAN 中&#xff0c;can_bittiming_const 结构体用于表示 CAN 总线的定时参数&#xff0c;包括位率&#xff08;bitrate&#xff09;的计算。can_bittiming_const 包含了许多与位率相关的参数&#xff0c;其中一些参数用于计算实际的位率。 下面是一些与位率计算相关的…

小辰的智慧树(差分+前缀和)

登录—专业IT笔试面试备考平台_牛客网 1.考虑总长度之和不能超过m&#xff0c;2考虑限制每棵树高度不能低于ci&#xff0c;如果用二分最短输能截到的高度&#xff0c;还要另外去判断&#xff0c;是否每棵树mid都能严格大于ci &#xff0c;这样容易超时&#xff0c;换个角度&…

SQL常见函数整理 _ lead() 向下偏移

1. 用法 是在窗口函数中使用的函数&#xff0c;它用于获取当前行的下一行&#xff08;后一行&#xff09;的某个列的值。具体来说&#xff0c;LEAD() 函数可用于查找任何给定行的下一行&#xff08;后一行&#xff09;的值&#xff0c;同时也可控制行数偏移量&#xff08;offse…

竞赛选题 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…