zoukankan      html  css  js  c++  java
  • CSRF 跨站

    CSRF

    跨站请求伪造

    	CSRF全称为Cross-site request forgery,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
    
      CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
    
    CsrfViewMiddleware的作用:
    	在render返回页面的时候,在页面中塞了一个隐藏的input标签;当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求
    
    跨站请求伪造csrf :
      1.网站的搭建 : 
    	写一个跟正规网站一模一样的页面;用户输入用户名 密码 对  方账户 转账金额提交,请求确实是朝银行的接口发送的 钱也扣了
     但是对方账户变了 变成了钓鱼网站自己提前设置好的账户
        
      2,钓鱼网站功能的实现 : 
        填写form表单的时候 让用户填写的对方账户input并没有name属性,是你自己在内部偷偷隐藏了一个具有name属性的input框,并且value值是你自己的账户 然后将该标签隐藏了
    

    解决跨站伪造问题:

    解决跨站问题 : 
    	1.让服务端只处理本网站发送的post请求
    	2.识别判断当前请求是否是本网张发出的
    
    	网站在返回给用户一个form表单的时候 会自动在该表单隐藏一个input框;框的value是一个随机字符串 但是网站能够记住每一个浏览器发送的随机字符串
    
    from 表单发送 POST请求:
    
    <form action="" method="post">
        {% csrf_token %}
        <p>username:<input type="text" name="username"></p>
        <p>target_account:<input type="text" name="target_user"></p>
        <p>money:<input type="text" name="money"></p>
        <input type="submit">
    </form>
    
    
    ajax 发送 POST请求:
    
        先在页面任意的位置上书写
        { % csrf_token %}
        
    1.方式1
        通过标签查找获取随机字符串添加到data自定义对象即可
        data: {'username': 'jason', 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},
    
    2.方式2
        data: {'username': 'jason', 'csrfmiddlewaretoken': '{{ csrf_token }}'},
    
    3.方式3	
        直接兴建js文件拷贝代码,导入即可
        csrf.js文件 
    
    

    csrf 相关的装饰器:

    #1. FBV模型:
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    
    # @csrf_exempt  # 不校验 csrf(中间件)
        def index(request):
            return HttpResponse('index') 
        
    # @csrf_protect  # 校验
        def login(request):
            return HttpResponse('login')
    
    # 2. CBV模型:
     	
        from django.utils.decorators import method_decorator
    
     1.# @method_decorator(csrf_exempt,name='xxx')  # csrf_exempt  不支持装饰  
    
     2.@method_decorator(csrf_exempt,name='dispatch')  # csrf_exempt  支持装饰 dispatch
    class HomeView(View):
    
        # @method_decorator(csrf_exempt)  # 支持装饰
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
    	# @method_decorator(csrf_exempt,name='post')  # csrf_exempt不支持该方法
        def post(self,request):
            return HttpResponse('OK')
    
    
    总结 : csrf_exempt这个装饰器只能给dispatch装才能生效
    	   csrf_protect方式全都可以跟普通的装饰器装饰CBV一致
    

    csrf.js文件:

    # ajax  csrf.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);
        }
      }
    });
    
  • 相关阅读:
    在实践中培养学生学习软件工程的兴趣
    软件工程课程设计指导随笔
    软件工程——个人总结
    软件工程第二次作业——结对编程
    个人博客作业三:微软小娜APP的案例分析
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式软件设计第09实验报告
    嵌入式软件设计第10次实验报告
    嵌入式软件设计第7次实验报告8
  • 原文地址:https://www.cnblogs.com/shaozheng/p/11991863.html
Copyright © 2011-2022 走看看