一、csrf跨站请求伪造

概念引入

简介

  • 我们通过模仿一个钓鱼网站来提现csrf跨站请求伪造。

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻

eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户

讲解

首先我们看到名称伪造就发现有端倪,CSRF跨站伪造,我们可以简单的理解成钓鱼网站,钓鱼网站会拥有一个跟银行app网页一样的界面(具体到网址,网页内容都一样).当我们输入转账信息的时候,点击确定转账,这个时候钓鱼网站就会把我们提交的转账信息发送给真实的网站,但是在发送之前会把转账对象修改成他自己的账号,接着发送给真实的网站进行转账,并且他们在转账后会在极短的时间内连续把这笔钱转给不同的用户,从而达到让受害者无法追回的目的.所以有些网站就是用这种方式洗黑钱的.

代码如下

	钓鱼网站html部分代码
<form method="post" action="http://127.0.0.1:8000/real/">
<p>username:<input type="text" name="username"></p>
<p>target_user<input type="text"><input type="text" name="target_user" value="土匪" style="display: none"></p>
<p>Money:<input type="text" name="money"></p>
<input type="submit">
</form> real.views(真实网页的后端)
def real_html(request):
if request.method == 'POST':
username = request.POST.get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print(f'用户{username}给{target_user}转账了{money}元!!!')
return render(request, 'real.html')

思考:如何区分真假网站页面发送的请求

概念讲解

一.CSRF是什么?

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

二.CSRF可以做什么?

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。

三.CSRF的原理

下图简单阐述了CSRF攻击的思想:

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。

2.在不登出A的情况下,访问危险网站B。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了…)

3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

上面大概地讲了一下CSRF攻击的思想,我们可以用开头的银行转账的操作作为例子(仅仅是例子,真实的银行网站没这么傻)

二、csrf校验策略

概念讲解

	根据上面的案例,我们发现假网站也是通过post请求给真的网站发送转账请求的,因此解决问题的重点就在于如何检查post请求.

	这里我们使用csrf策略来解决这个问题,他的作用就是给网页添加这个csrf策略,然后在网页执行post请求的时候就会传一个csrf_token,根据这个token是否为后端传给前端的token来判断post请求是否符合要求(即是否安全可信).

拓展知识点(了解一下即可,课外找的)

Token的构成

消息[msg]:而msg本身也有两部分组成:一部分:随即字符串,过期时间戳。
分隔符[separator]:用于分割msg部分与加密后生成的signature签名部分,这里用的是"."
签名[signature]:singnature.signature签名,是对“msg消息”用特定算法进行加密后的字符串
token = base64(msg)格式化..base64(sha256("密码",msg))
Token由被base64的msg编码穿+256加密msg再进行Base64编码,两个字符串的内容结合

如果上面的拓展内容不想看,我们也可以简单理解一下这个token的作用,简单来说就是后端给前端发一个所谓的token编码,他是一串随机字符,这个字符只有产生他的服务端能识别,通过这个特性达到防止钓鱼网站进行诈骗。

form表单操作csrf策略

form表单内部添加 {% csrf_token %}

ajax请求csrf策略

	// 方式1:自己动手取值 较为繁琐
{#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
// 方式2:利用模板语法自动获取(一定要用引号引起来)
{#data:{ 'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},#}
// 方式3:直接引入一个js脚本即可(官网提供的)
参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html

js脚本代码

ps:直接使用JS脚本 拓展性最高

<script src="/static/csrf.js"></script>
这里我们把下方代码写到一个js文件中然后使用的时候在网页中导入js代码就能生效。 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 protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
} $.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

注意事项

	当我们使用csrf校验策略的时候需要打开配置文件中的中间件注册信息(就是我们平时在使用post请求时需要去配置文件注释掉的那个配置).

	打开配置就等于所有的请求都需要检验csrf校验策略,注释掉就等于都不检查.

三、csrf相关装饰器

当我们知道csrf的作用和使用方式后,我们联系实际情况考虑到实际应用中会出现下列情况:

  • 整个django项目都校验csrf 但是某些个视图函数\类不想校验
  • 整个django项目都不校验csrf 但是某些个视图函数\类需要校验

根据FBV和CBV的分类,导入时候有所区别:

FBV添加装饰器的方式(与正常函数添加装饰器一致)
from django.views.decorators.csrf import csrf_exempt, csrf_protect # @csrf_exempt
想让csrf校验检测就使用装饰器@csrf_protect,不想让csrf校验检测就使用@csrf_exempt
@csrf_protect
def transfer_func(request):pass CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
# @method_decorator(csrf_protect, name='post') # 方式2:单独生效
class MyView(views.View):
@method_decorator(csrf_protect) # 方式3:整个类中生效
这里需要会去看CBV的源码剖析,CBV源码内起作用的也是dispaly,通过反射执行字符串表示的功能,因此第三种方式是整个类中生效的。
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) # @method_decorator(csrf_protect) # 方式1:单独生效
def post(self, request):
return HttpResponse('from cbv post view') 注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispatch方法处添加才会生效

csrf跨站请求伪造与校验策略的更多相关文章

  1. 12月23日内容总结——csrf跨站请求伪造、校验策略、相关装饰器,auth认证模块及相关操作,拓展auth_user表

    目录 一.csrf跨站请求伪造 概念引入 概念讲解 二.csrf校验策略 概念讲解 form表单操作csrf策略 ajax请求csrf策略 三.csrf相关装饰器 四.auth认证模块 五.auth认 ...

  2. csrf跨站请求伪造、csrf校验策略、csrf相关装饰器、auth认证模块、auth认证相关模块及操作、扩展auth_user表

    今日内容 csrf跨站请求伪造 钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户,但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费,但是你会发现卡里 ...

  3. SpringSecurity原理解析以及CSRF跨站请求伪造攻击

    SpringSecurity SpringSecurity是一个基于Spring开发的非常强大的权限验证框架,其核心功能包括: 认证 (用户登录) 授权 (此用户能够做哪些事情) 攻击防护 (防止伪造 ...

  4. Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法

    Django框架 目录 Django框架 一.csrf跨站请求伪造 1.简介 2.csrf校验策略 form表单csrf策略 ajax请求csrf策略 3.csrf相关装饰器 FBV添加装饰器方式 C ...

  5. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  6. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  7. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  8. Django框架(十六)-- 中间件、CSRF跨站请求伪造

    一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...

  9. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  10. Django框架(十七)—— 中间件、CSRF跨站请求伪造

    目录 中间件 一.什么是中间件 二.中间件的作用 三.中间件执行顺序 四.自定义中间件 1.导包 2.定义类,继承MiddlewareMixin 3.在视图函数中定义一个函数 4.在settings的 ...

随机推荐

  1. 2. 解释器与PyCharm安装

    1. 解释器安装 官网 选择解释器版本 建议选择比最新版本低2~3个版本,当前选择3.10 添加到环境变量,如不勾选后续可手动配置 安装完成后已将解释器安装路径自动添加到环境变量中 将解释器安装路径添 ...

  2. c++可变模板参数

    在C++中的可变模板参数使用省略号 ... 来表示一个参数包(Parameter Pack),其具体位置决定了这个包是模板参数包还是函数参数包,以及如何进行参数展开. 1. 模板参数包:c... Ar ...

  3. [摘录] WebView2 与 JS 交互

    https://docs.microsoft.com/zh-cn/microsoft-edge/webview2/gettingstarted/win32 步骤 5-脚本 托管应用还可以将 JavaS ...

  4. 使用DeepKE训练命名实体识别模型DEMO(官方DEMO)

    使用DeepKE训练命名实体识别模型DEMO(官方DEMO) 说明: 首次发表日期:2024-10-10 DeepKE资源: 文档: https://www.zjukg.org/DeepKE/ 网站: ...

  5. vue前端开发仿钉图系列(3)右侧画点线面的开发详解

    项目开发是完全仿照钉图的功能,参照钉图的逻辑和高德地图的参考手册以及aip文档,一点点的把功能做出来并呈现最后的效果.选中画点,在地图上获取经纬度并进行反地理编码,添加marker并弹出右侧编辑页面, ...

  6. 09-react的组件传值 props

    // 组件传值 props 接收传递过来的数据 import ReactDom from "react-dom" import { Component } from "r ...

  7. 使用AndroidStudio开发cocos2d-x,以及可能会出现的问题

    1. 使用AndroidStudio开发cocos2d-x流程 1.1 通过cocos2d-x官网(https://www.cocos.com/)下载cocos2d-x文件 1.2 安装python环 ...

  8. 云原生周刊:Flux 2.3 发布 | 2024.5.20

    开源项目推荐 kubeinvaders kubeinvaders 专为 Kubernetes 用户设计.它提供了一种有趣而交互式的方式来探索和可视化您的 Kubernetes 集群.通过类似游戏的界面 ...

  9. Machine Learning Week_6 Adjust the Model.

    目录 0 Advice for Applying Machine Learning 1 Evaluating a Learning Algorithm 1.1 Deciding What to Try ...

  10. 比较var和let的区别

    什么是作用域 块级作用域:即在{}花括号内的域,由{ }包括,比如if{}块.for(){}块.注意函数快也叫做块 函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的. JS ...