跨站请求伪造(scrf)、设置scrf值、CBV加装饰器

跨站请求伪造(scrf)

听说过钓鱼网站吗?

就类似于你搭建了一个跟银行一模一样的web页面
用户在你的网站转账的时候输入用户名 密码 对方账户
银行里面的钱确实少了 但是发现收款人变了

原理:

你写的form表单中 用户的用户名  密码都会真实的提交给银行后台
但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框
你自己提前写好了一个隐藏的带有name和value的input框

解决钓鱼网站的策略:

只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串
当用户提交post请求的时候  我会自动先取查找是否有该随机字符串
如果有 正常提交
如果没有  直接报403 

所以!!

那个被我们注释掉的中间件,就是用来校验你有没有这个随机字符串的。

这就是django自带的东西,你可以理解为,这个中间件不允许的前端post请求,都不能通过这一层校验,要怎样让post请求成功呢,就要让他通过校验。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>

</head>
<body>
<h1>我是正儿八经的网站</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>target_user:<input type="text" name="target_user"></p>
    <p>money:<input type="text" name="money"></p>
    <input type="submit">
</form>

只需要加上 {% csrf_token %} 就可以通过校验了。这是正常form表单提交post请求的时候的做法,还有一种可以提交post的就是 ajax 请求。

ajax的做法

方式一、自己现在页面上写 {% csrf_token %} 获取到随机字符串 然后利用标签查找,然后在ajax发送的数据的 data 中加上这个键值对

data:{'username':'jason','csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()},

csrfmiddlewaretoken 这个是要记住的,这个单词

方式二、

 data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}

这个是django提供的模板语法,但是在前后端分离的时候就不能用了,所以不推荐。

方式三、导入js,不需要理解这个js代码,这个是从官网上c下来的,只需写一个静态文件,放进去,然后配置静态文件就可以了。建议把这段代码保存在本地。

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);
    }
  }
});
<script src="/static/setup.js"></script>
{#导入这一句就可以了#}

推荐这种。

学了这个之后,就不用在注释那个中间件了。

现在又有个需求了,想要让有个视图函数不校验 csrf ,怎么做?

要导入一个模块

from django.views.decorators.csrf import csrf_exempt, csrf_protect

csrf_exempt 是让一个函数绕过校验,不用校验。

现在突然又发神经有个新的需求,在注释了 csrf 中间件之后,想要校验一个函数,怎么做。

csrf_protect 让一个函数被校验。

以上两种都是以装饰器的形式来发挥作用的

@csrf_exempt #装饰了这个装饰器之后,就可以绕过校验了。不用那个随机字符串了
def exem(request):
    return HttpResponse('exempt')

@csrf_protect #装饰了这个装饰器就会被校验了。
def pro(request):
    return HttpResponse('pro')

以上是 FBV 型的,那么CBV类型的要怎么写呢?

 装饰器
        csrf_exempt  只有两种装饰的方式
        from django.views.decorators.csrf import csrf_exempt, csrf_protect
        from django.utils.decorators import method_decorator
        # 第一种
        # @method_decorator(csrf_exempt,name='dispatch')
        class MyCsrf(View):
            # 第二种
            @method_decorator(csrf_exempt)
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request,*args,**kwargs)
            def get(self,request):
                return HttpResponse('hahaha')

        除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式
        @method_decorator(csrf_protect,name='post') #第一种
        class MyCsrf(View):
            @method_decorator(csrf_protect)#第二种
            def dispatch(self, request, *args, **kwargs):
                return super().dispatch(request,*args,**kwargs)
            def get(self,request):
                return HttpResponse('hahaha')

            @method_decorator(csrf_protect)#第三种
            def post(self,request):
                return HttpResponse('post')

原文地址:https://www.cnblogs.com/chanyuli/p/11768711.html

时间: 2024-07-30 04:34:56

跨站请求伪造(scrf)、设置scrf值、CBV加装饰器的相关文章

Django之cfrs跨站请求伪造和xfs攻击

跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全局和局部. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件. @csrf_exempt,取消当前函数防跨站请

跨站请求伪造(防护)

跨站请求伪造(防护) 任何Web应用所面临的一个主要安全漏洞是跨站请求伪造,通常被简写为CSRF或XSRF,发音为"sea surf".这个漏洞利用了浏览器的一个允许恶意攻击者在受害者网站注入脚本使未授权请求代表一个已登录用户的安全漏洞. 为了防范伪造POST请求,我们会要求每个请求包括一个参数值作为令牌来匹配存储在cookie中的对应值.我们的应用将通过一个cookie头和一个隐藏的HTML表单元素向页面提供令牌.当一个合法页面的表单被提交时,它将包括表单值和已存储的cookie.如

深入解析跨站请求伪造漏洞:实例讲解

本文的上篇中,我们着重介绍了跨站请求伪造的原理,并指出现有的安全模型并不能真正防御这种攻击.在下篇中,我们将向读者介绍在一些大型站点上发现的几个严重的CSRF漏洞,攻击者利用这些漏洞不仅能够采集用户的电子邮件地址,侵犯用户隐私并操控用户帐户.如果金融站点出现了跨站请求伪造漏洞的话,这些漏洞甚至允许攻击者从用户的银行帐户中划走资金.为了全面的防御CSRF攻击,建议对服务器端进行改造.此外,本文还会介绍服务器端解决方案应具备的特征,如果缺乏这些特性,就会导致CSRF保护措施不必要地妨碍典型的web浏

跨站请求伪造

1. 什么是跨站请求伪造(CSRF)  CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用.尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左.XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站.与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少

Web安全测试之跨站请求伪造(CSRF)篇

跨站请求伪造(即CSRF)被Web安全界称为诸多漏洞中“沉睡的巨人”,其威胁程度由此“美誉”便可见一斑.本文将简单介绍该漏洞,并详细说明造成这种漏洞的原因所在,以及针对该漏洞的黑盒测试与灰盒子测试具体方法和示例,最后提提了一些防范该攻击的建议,希望本文对读者的安全测试能够有所启发. 一.CSRF概述 我们首先来了解一下什么是跨站请求伪造(CSRF)?跨站请求伪造是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法.攻击者只要借助少许的社会工程诡计,例如通过电子邮件或者是聊天

CSRF(跨站请求伪造攻击)漏洞详解

Cross-Site Request Forgery(CSRF),中文一般译作跨站点 请求伪造.经常入选owasp漏洞列表Top10,在当前web漏洞排行中,与XSS和SQL注入并列前三.与前两者相比,CSRF相对来说受到的关注要小很多,但是危害却非常大. 通常情况下,有三种方法被广泛用来防御CSRF攻击:验证token,验证HTTP请求的Referer,还有验证XMLHttpRequests里的自定义header.鉴于种种原因,这三种方法都不是那么完美,各有利弊. 二 CSRF的分类 在跨站请

跨站请求伪造 CSRF / XSRF&lt;一:介绍&gt;

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. ***跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任. 攻击的细节 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执

CSRF(跨站请求伪造攻击)详解以及防护之道

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性.然而,该攻击方式并不为大家所熟知,很多网站都有 CSRF 的安全漏洞.本文首先介绍 CSRF 的基本原理与其危害性,然后就目前常用的几种防御方法进行分析,比较其优劣.最后,本文将以实例展示如何在网站中防御 CSRF 的攻击,并分享一些开发过程中的最佳实践. C

跨站请求伪造攻击的基本原理与防范

摘要:文章介绍了跨站请求伪造攻击的基本情况,并以两种常见的场景作为讲解的范例,分析了该类攻击的主要原理与产生条件.针对跨站请求伪造攻击的主要 目标和所利用的漏洞,重点介绍了5种不同的防范方法,并简单的说明5种方法各自的优劣之处.为Web应用系统的安全防范和设计提供参考. 1 跨站请求伪造简介 跨站请求伪造(Cross Site Request Forgery,简称CSRF),也被称为"one click attack"或"session riding".跨站请求伪造