• Django-website 程序案例系列-12 CSRF


    django为用户实现防止跨站请求伪造的功能

    需要配置settings.py:

       django.middleware.csrf.CsrfViewMiddleware

    1. form表单提交

    <form action="/logi/" method="POST">
        {% csrf_token %}    #需要在form表单中添加{% csrf_token %} 
        <input type="text" name="user"/>
        <input type="text" name="pwd"/>
        <input type="checkbox" name="rmb" value="1" /> 10秒免登陆
        <input type="submit" value="提交"/>
    </form>
    

      

    2. ajax提交方式一

    js使用ajax来提交数据,在其中加入csrf
    <script src="/static/jquery.min.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>
        $(function () {
            $('#btn').click(function () {  
                $.ajax({
                    url: '/logi/',
                    type: "POST",
                    data: {'user': 'root', 'pwd': '123'},
                    headers: {'X-CSRFtoken': $.cookie('csrftoken')},  #设置csrftoken到http响应头中,其中键是X-CSRFtoken是django固定的键名字
                    success:function(arg){
    
                    }
                })
            })
        })
    </script>
    

      

     3. ajax提交方式二

        <script src="/static/jquery.min.js"></script>
        <script src="/static/jquery.cookie.js"></script>
    <script>
        $(function () {
            $.ajaxSetup({  #使用ajax配置,使用后可以实现本网页所有的ajax请求只写一次配置(ajax全局配置)
                beforeSetup: function(xhr,settings) {
                    xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken')); # 在请求头中加入csrftoken来实现所有的ajax请求只配置一次
                }
            })
    
            $('#btn').click(function () {   #以上配置后就不用再ajax中在配置csrftoken了(header: {'X-CSRFtoken': $.cookie('csrftoken')})
                $.ajax({
                    url: '/ind/',
                    type: "POST",
                    data: {'user': 'root', 'pwd': '123'},
                    success:function(arg){
                    }
                })
            })
        })
    </script>
    

     3. ajax提交方式三

        <script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
        <script src="/static/plugin/jquery/jquery.cookie.js"></script>
        <script type="text/javascript">
            var csrftoken = $.cookie('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) {   #判断哪些请求才使用CSRF功能
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });
            function Do(){
                $.ajax({
                    url:"/app01/test/",
                    data:{id:1},
                    type:'POST',
                    success:function(data){
                        console.log(data);
                    }
                });
            }
        </script>
    

      

     关于CSRF的django配置:

    1. 全局:

    在django中的sttings.py配置文件中使用     

    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',
    ]
    

      

    2. 局部:

    使用django提供的csrf装饰器来实现

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

    注:使用的时候必须导入  from django.views.decorators.csrf import csrf_exempt,csrf_protect

    例如:

    from django.views.decorators.csrf import csrf_exempt,csrf_protect  #导入django自带的CSRF包
    
    @csrf_exempt   # 加装饰器来实现该函数不需要CSRF认证(全局设置有效)
    def login1(request):
          pass
    
    @csrf_protect  # 加装饰器来实现该函数需要CSRF认证(未使用全局设置)
    def login2(request):
          pass
    注:这样可以灵活的使用装饰器来达到函数的定制需求

      

  • 相关阅读:
    element:记一次重置表单引发提交数据为默认数据现象
    三种常用又简单的排序算法
    (07)GitHub从2021.08.13开始使用Token代替账号和密码
    does not implement methodSignatureForSelector:
    自用python库
    2048
    CCSP2021游记
    2021 CCPC 桂林站游记
    2021 ICPC 沈阳站游记
    2021SDU新生赛游记
  • 原文地址:https://www.cnblogs.com/kuku0223/p/8087239.html
Copyright © 2020-2023  润新知