首页 > 其他分享 >csrf跨站请求伪造与校验策略

csrf跨站请求伪造与校验策略

时间:2023-05-06 15:44:57浏览次数:50  
标签:跨站 csrf 网站 request 校验 CSRF 请求

目录

一、csrf跨站请求伪造

概念引入

简介

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

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户

讲解

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

image

代码如下

	钓鱼网站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攻击的思想:

image

从上图可以看出,要完成一次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);
        }
    }
});

image

image

注意事项

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

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

image

三、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方法处添加才会生效

image


标签:跨站,csrf,网站,request,校验,CSRF,请求
From: https://www.cnblogs.com/zhihuanzzh/p/17377571.html

相关文章

  • java 手动校验dto
    1在Java中进行手动校验DTO的方法有很多种,这里提供一种常用的校验方法,使用HibernateValidator实现:231.添加依赖45首先需要在Maven或Gradle中添加HibernateValidator的依赖:67Maven:89```xml10<dependency>11<groupId>......
  • 验证码,发送短信验证码,校验确认密码和密码,密码需要数字字母特殊字符任选2种组合
    密码需要数字字母特殊字符任选2种组合constvalidatePwd=(rule,value,callback)=>{constreg=/(?!^(\d+|[a-zA-Z]+|[~!@#$%^&*?]+)$)^[\w~!@#$%^&*?]{8,32}$/if(reg.test(value)==true){callback()}else{callback(newError(&#......
  • SAP ERP系统MM模块常用增强之四:采购申请输入字段的校验检查
    在SAP/ERP项目的实施中采购管理模块(MM)的创建和修改采购申请一般都会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,这方面需求部分是可以通过配置实现,比如一些字段是否必输,是否显示等,但是在实际项目中还是会遇到一些特殊的需求,比如需要一定逻辑判断的需求就不能通过......
  • SpringMVC03_校验和拦截器
    以下代码全过程在上篇一、SpringMVC校验​ 举一个简单的例子,在登陆时我们要检验用户名是否输入、密码是否合法。(一)引入依赖框架​ 在Spring-MVC中我们需要添加Hibernate的Validator检验框架,注意下面的版本号,615Final对应的应该是importjavax.validation.constraints......
  • m基于整数序列的QC-LDPC的稀疏校验矩阵构造算法性能对比matlab仿真,对比差分序列,PEG,
    1.算法仿真效果matlab2013b仿真结果如下:  2.算法涉及理论知识概要       QC-LDPC(Quasi-CyslicLow-DensityParity-CheckCodes)即准循环LDPC码。之前介绍的LDPC码基本属于随机构造法,构造出的码性能很好,但校验矩阵具有不规律性,存在校验矩阵存储于读取困难、编码复......
  • m基于大衍数无高阶环稀疏校验矩阵H构造算法和RMP消息传递的QC-LDPC性能matlab仿真
    1.算法仿真效果matlab2017b仿真结果如下:   2.算法涉及理论知识概要LDPC码早于1962年由Gallager提出,可以看成是一个具有稀疏校验矩阵的线性分组码。自从Mackay和Neal发现LDPC码的性能非常接近香农限以后,LDPC码越来越受到人们的重视。基于准循环LDPC(QC-LDPC)码结......
  • SpringBoot项目使用 validation进行数据校验
    validation进行数据校验@Validated注解和@Valid注解都是SpringFramework中用于数据校验的注解,但它们有以下几点区别:所在包路径不同:@Valid注解位于javax.validation.constraints包下,而@Validated注解位于org.springframework.validation.annotation包下。支持......
  • sap ui5 结束日期校验
    <DatePickerplaceholder=""value="{path:'OtherModel>endDate'}"......
  • 校验日期格式2008-01-01
    校验日期格式2008-01-01functionIsValidDate(dateStr){vardatePat=/^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/;varmatchArray=dateStr.match(datePat);if(matchArray==null){returnfalse;}year=matchArray[1];month=match......
  • 正则校验手机号
    //校验手机号functioncheckPhone(phone){varflag=true;//手机号varreg=/^1[3|4|5|7|8][0-9]\d{8}$/;//电话varreg0=/^(0[1-9]\d{1,2}-)\d{6,7}$/;if(reg.test(phone)==false&&reg0.test(phone)==false){console.lo......