zoukankan      html  css  js  c++  java
  • Django中CSRF原理

    不要注释掉Csrf
    MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]

    前端开始提交时候,就会有个校验Csrf校验

    通过form表单提交

        <form action="/login/" method="post">
    
              {% csrf_token %}
          #HTML会生成一个input元素参与到form表单提交中
    <input type="text" name="user"> <input type="text" name="password"> <input type="checkbox" name="rmb" value="1">10秒免登录 <input type="submit" value="提交"> <input id='btn' type="button" value="按钮"> </form>

    通过AJAX提交

    <script>
    
            {##配置默认在触发AJAX请求加上headers#}
            $(function () {
               $.ajaxSetup({
                   {#xhr 所有的ajax底层操作都是XMLHttpRequest#}
                   beforeSend:function (xhr,settings) {
                       xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
                   }
               })
            });
    
    
    
            $(function () {
                $('#btn').click(function () {
                    $.ajax({
                        url:"/login/",
                        type:"POST",
                        {#headers:{'X-CSRFtoken':$.cookie('csrftoken')},#}
                        data:{"user":"root","pwd":"121"},
                        success:function (arg) {
                            console.log(arg);
                        }
    
                    })
                })
            })
        </script>

    setting中配置django.middleware.csrf.CsrfViewMiddleware是全局变量

    当views中可以指定一个模块要进行Csrf,可以在方法上加上装饰器

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
    示例:
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    @csrf_protect
    def test():
      print('1234')


    前端通过Ajax请求方式判断是否需要进行跨站请求

       <script type="text/javascript">
            var csrftoken = $.cookie('csrftoken');{#获取csrf#}
      
            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);
                    }
                }
            });
            function Do(){
      
                $.ajax({
                    url:"/app01/test/",
                    data:{id:1},
                    type:'POST',
                    success:function(data){
                        console.log(data);
                    }
                });
      
            }
        </script>
  • 相关阅读:
    ASP.NET HTTP模块和处理程序(5)(转载)
    充分利用ASP.NET的三种缓存提高站点性能(转载)
    LINQ体验(4)——LINQ简介和LINQ to SQL语句之Where
    理解DataSet的数据缓存机制
    在ASP.NET中实现AJAX(一)
    ASP.NET HTTP模块和处理程序(2)(转载)
    ASP.NET HTTP模块和处理程序(1)(转载)
    aspx页面中文汉字显示为乱码
    贫血还是充血?(转载)
    ASP.NET HTTP模块和处理程序(3)(转载)
  • 原文地址:https://www.cnblogs.com/anhao-world/p/14845994.html
Copyright © 2011-2022 走看看