首页 > 其他分享 >Django csrf跨站请求伪造,校验,CBV忽略与允许csrf校验

Django csrf跨站请求伪造,校验,CBV忽略与允许csrf校验

时间:2024-03-25 10:25:30浏览次数:15  
标签:跨站 name request 校验 csrf exempt method

csrf跨站请求伪造

钓鱼网站,搭建一个网站与正规网站一模一样的界面,用户进入到我们的网站中,给指定用户转账,汇款确实提交到银行,但是收款人确实我们自己定义的人。

本质在钓鱼网站的页面针对对方账户,只给用户提供一个没有name属性的普通input框,在内部则隐藏一个已经写好的name和value的input框

代码举例:

<form action="" method="post" >
    <p>转账用户: <input type="text" name="name"></p>
    <p>被转账用户: <input type="text"></p>
    <input type="text" name="user" value="junjie" style="display: none;">
    <p>金额: <input type="text" name="money"></p>
    <input type="submit" value="确定">
</form>

后端:

def transfer(request):
    if request.method == 'POST':
        print(f'{request.POST.get("name")}向{request.POST.get("user")}转战{request.POST.get("money")}')
        print(request.POST)
    return  render(request,'transfer.html')

前端用户输入被转账用户名称无name属性,使用自定义,所以前端不管给谁转账都是给junjie转账

如何规避上述问题?

csrf跨站请求伪造校验

网站再给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识,当这个页面朝后端发送post请求的时候,后端先校验唯一标识,如果唯一标识不对直接拒绝(403 forbbiden),成功则正常执行

针对form表单

<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>

针对ajax设置固定的静态文件

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);
    }
  }
});

将下面的文件配置到你的Django项目的静态文件中,在html页面上通过导入该文件即可自动帮我们解决ajax提交post数据时校验csrf_token的问题,(导入该配置文件之前,需要先导入jQuery,因为这个配置文件内的内容是基于jQuery来实现的)

更多细节详见:Djagno官方文档中关于CSRF的内容

# ajax如何符合校验
// 第一种 利用标签查找获取页面上的随机字符串
{#data:{"username":'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},#}
// 第二种 利用模版语法提供的快捷书写
{#data:{"username":'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},#}
// 第三种 通用方式直接拷贝js代码并应用到自己的html页面上即可
data:{"username":'jason'}

csrf相关装饰器

现在提出连个需求:

网站整体不校验csrf,就单单几个视图函数需要校验
网站整体校验csrf,就单单几个视图函数不校验
针对这两种情况Django内部有两个装饰器

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

以下为FBV


反之整个网站都不需要校验,只有装饰器装饰的函数需要校验。

以下为CBV

url(r'^csrf'/,views.MyCsrfToken.as_view())
from django.views import View

# @method_decorator(csrf_protect,name='post')  # 针对csrf_protect 第二种方式可以
# @method_decorator(csrf_exempt,name='post')  # 针对csrf_exempt 第二种方式不可以
@method_decorator(csrf_exempt,name='dispatch')
class MyCsrfToken(View):
    # @method_decorator(csrf_protect)  # 针对csrf_protect 第三种方式可以
    # @method_decorator(csrf_exempt)  # 针对csrf_exempt 第三种方式可以
    def dispatch(self, request, *args, **kwargs): V
        return super(MyCsrfToken, self).dispatch(request,*args,**kwargs)

    def get(self,request):
        return HttpResponse('get')

    # @method_decorator(csrf_protect)  # 针对csrf_protect 第一种方式可以
    # @method_decorator(csrf_exempt)  # 针对csrf_exempt 第一种方式不可以
    def post(self,request):
        return HttpResponse('post')

标签:跨站,name,request,校验,csrf,exempt,method
From: https://www.cnblogs.com/HeroZhang/p/18093805

相关文章

  • CSRF & SSRF
    CSRF&SSRFCSRFCSRF(Cross-SiteRequestForgery)(跨站请求伪造漏洞)原理用户访问网站,网站给用户cookie,此时攻击者给用户发送了一个诱惑链接,链接里有对该网站的访问代码,用户点击攻击者的链接后,触发恶意代码,攻击者就利用用户的cookie,执行了对网站的请求(以接口形式调用请求)......
  • react我需要在表格数据变化后,下一次渲染结束后,执行表单校验逻辑
    在React中,要在表格数据变化后且下一次渲染完成后执行表单校验逻辑,可以考虑在useEffect钩子中处理这个问题。useEffect会在每次渲染完成后的DOM更新之后执行指定的回调函数。以下是一个简化的示例:importReact,{useState,useEffect}from'react';functionYourComponent({......
  • windows校验下载文件的md5
    有时候我们在下载文件时会有md5校验,这个是用来校验我们下载的文件是否完整正确,防止文件被不法之徒篡改,那么怎样校验呢?今天我们就来看看校验的方法。比如在网页上,文件apache-maven-3.5.2-bin.zip的旁边会出现md5校验,apache-maven-3.5.2-bin.zip.md5,我们点击进去会显示这样一串字......
  • xss跨站脚本攻击
    xss(cross-sitescripting)本因为css,因与css样式重名所以更名为xss。xss主要基于js完成恶意攻击XSS危害盗取用户账号窃取用户cookie,冒充用户身份进入网站劫持用户会话,执行任意操作刷流量,执行弹窗广告传播蠕虫病毒XSS漏洞验证PoC(ProofofConcept,概念验证,漏洞验证)EXP(......
  • 校验码
          ......
  • csrf防御的思考
    关于csrf防御什么是csrfcsrf就是攻击者利用受信任用户的浏览器(利用浏览器的cookie),在其已经登录某个站点(A站点)的情况下,在用户不知情的情况下在A站点执行了恶意操作。恶意url一旦点击,发送请求时浏览器会自动携带cookie从上面简介可知,发生csrf主要在于A站点,没有对发起的请求进行充......
  • 软考备考复习笔记day2(校验码crc和海明码检错纠错)
    奇偶校验奇偶校验(ParityCodes)是通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验)。但该编码只能检错,但不能纠错。奇偶校验:码距为2。码距越大越容易纠错和检错仅检测出代码中奇数位数(奇数个0或1发生错误),不能发现偶数位数出错。奇数+偶数=奇数......
  • pikachu靶场第八关——XSS(跨站脚本)之DOM型xss(附代码审计)
    什么是DOM?简单来说DOM文档就是一份XML文档,当有了DOM标准之后,DOM便将前端html代码化为一个树状结构,方便程序和脚本能够轻松的动态访问和更新这个树状结构的内容、结构以及样式,且不需要经过服务端,所以DOM型xss在js前端自己就可以完成数据的输入输出,不与服务器产生交互,这样来说DO......
  • Java自定义注解实现参数校验
    1、定义注解内    自定义如下,本例子以校验手机号码为例需要校验手机号码标上此注解即可。其中Mobilelidator类则是实现自定义校验ConstraintValidator类的接口实现类2、ConstraintValidator 定义接口实现  ConstraintValidator 自定义接口实现如下图......
  • 从单机到分布式微服务,大文件校验上传的通用解决方案
    一、先说结论本文将结合我的工作实战经历,总结和提炼一种从单体架构到分布式微服务都适用的一种文件上传和校验的通用解决方案,形成一个完整的方法论。本文主要解决手段包括多线程、设计模式、分而治之、MapReduce等,虽然文中使用的编程语言为Java,但解决问题和优化思路是互通的,......