zoukankan      html  css  js  c++  java
  • Django的crfs_token解决办法

    解除中间件csrf_token的保护机制的办法

    原理:django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。当用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错

    全局:

      中间件 django.middleware.csrf.CsrfViewMiddleware

    局部:

      @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。/n@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

    解决办法:

      通过form提交:

       需要在表单里面添加   {%csrf_token%} 标签

      通过ajax提交:

        方法一:

      通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送。  

    $.ajax({
      url: "/cookie_ajax/",
      type: "POST",
      data: {
        "username": "Q1mi",
        "password": 123456,
        "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data中
      },
      success: function (data) {
        console.log(data);
      }
    })

      方法二:

        通过获取返回的cookie中的字符串 放置在请求头中发送。

    $.ajax({
      url: "/cookie_ajax/",
      type: "POST",
      headers: {"X-CSRFToken": $.cookie('csrftoken')},  // 从Cookie取csrftoken,并设置到请求头中
      data: {"username": "Q1mi", "password": 123456},
      success: function (data) {
        console.log(data);
      }
    })

      方三:

        或者用自己写一个getCookie方法:适用于全局

        这是一段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);
        }
      }
    });

      

    注意:

    如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。

    如果你的视图渲染的HTML文件中没有包含 {% csrf_token %},Django可能不会设置CSRFtoken的cookie。

    这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie

    django.views.decorators.csrf import ensure_csrf_cookie
    
    
    @ensure_csrf_cookie
    def login(request):
        pass

        

  • 相关阅读:
    react 有多个按钮时点击单个按钮独立控制Loading
    React路由通信
    体育竞技模拟比赛
    json与csv格式相互转换
    替换表格内容及csv转html及CGI
    excel转换成csv格式
    文件读写笔记
    自定义手绘风
    numpy&matplotlib读书笔记
    Python成绩雷达图
  • 原文地址:https://www.cnblogs.com/wy3713/p/9677493.html
Copyright © 2011-2022 走看看