• Django之CSRF 跨站请求伪造


    一、简介

    1、点我了解什么是跨站请求伪造

    2、django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能又分为全局和局部。

    • 全局
    通过修改django中settings文件中中间件列表中的django.middleware.csrf.CsrfViewMiddleware,如果注释该选项,则表示全局不启用,否则表示全局启用
    
    • 局部
    # 该装饰器加在views中的函数上
    from django.views.decorators.csrf import csrf_exempt,csrf_protect   # 导入装饰器
    @csrf_protect    # 为当前函数强制设置防跨站请求伪造功能,如果settings中没有设置全局中间件,在views中的函数加上该装饰器,则表示对该函数启用CSRF功能
    @csrf_exempt    # 取消当前函数防跨站请求伪造功能,如果settings中设置了全局中间件,在views中的函数加上该装饰器,则表示对该函数不启用CSRF功能
    

    二、应用

    1、通过form表单提交

    • csrf.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <form action="/csrf/" method="post">
            
            <!-- html通过该simple_tag参数由模板渲染将其转换成一个隐藏的input标签,例如:
            <input type="hidden" name="csrfmiddlewaretoken" value="9BxEgRk6hMR8bLPwLJs516YHCsNihbK47Lc3CyPASUcXZXS4r9M0j3zz2QOsmJaC"> -->
            {% csrf_token %}
            <input type="text" name="v" />
            <input type="submit" value="提交" />
        </form>
    
    </body>
    </html>
    
    • views.py
    from django.shortcuts import render
    
    from django.views.decorators.csrf import csrf_protect
    
    # Create your views here.
    
    @csrf_protect
    def csrf(request):
        return render(request, 'csrf.html')   # 这个地方一定要使用render,因为要对csrf.html中的模板语言进行渲染
    

    2、通过Ajax提交

    • csrf.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {% csrf_token %}
    
        <input type="button" onclick="Do();"  value="提交"/>
    
    
        <script src="/static/jquery-1.12.4.js"></script>
        <script src="/static/jquery.cookie.js"></script>
        <script type="text/javascript">
    
            {# 从cookie中拿到csrftoken #}
            var csrftoken = $.cookie('csrftoken');
    
            function csrfSafeMethod(method) {
                // these HTTP methods do not require CSRF protection
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }
    
            {# 当所有ajax发送数据之前都执行以下这个配置,自动将cookie中的csrftoken加入到request中的head中 #}
            $.ajaxSetup({
                beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });
            function Do(){
    
                $.ajax({
                    url:"/csrf/",
                    data:{id:1},
                    type:'POST',
                    success:function(data){
                        console.log(data);
                    }
                });
    
            }
        </script>
    
    </body>
    </html>
    
    • views.py
    from django.shortcuts import render
    
    from django.views.decorators.csrf import csrf_protect
    
    
    @csrf_protect
    def csrf(request):
        return render(request, 'csrf.html')
    

    点我查看官方详细说明

  • 相关阅读:
    在Linux下安装和使用MySQL
    vc动态装载动态库
    stl学习(转帖2)
    makefile
    详细的MySQL C API
    Excel INTO SQLSERVER
    Outlook2010中预览Word,Excel附件问题
    11gRAC ASM管理的数据文件丢失恢复
    ASM上控制文件损坏时的恢复
    使用NET USER增加一个超级管理 & 激活Windows 7 administrator
  • 原文地址:https://www.cnblogs.com/CongZhang/p/5894598.html
Copyright © 2020-2023  润新知