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>
原文地址:https://www.cnblogs.com/anhao-world/p/14845994.html