• [oldboy-django][4python面试]有关csrf跨站伪造请求攻击


    1 csrf定义

    - csrf定义:Cross Site Request Forgery,跨站请求伪造
            举例来说:
                网站A伪造了一个图片链接:
                <a href="http://www.cmbchina.com/?to=652222287448748&money=1999999><img></img></a>
                该链接指向招商银行的转账链接, 而如果当前浏览器存储当前用户在招商银行Cookie。
                用户登录了A网站,点击上面的图片,就会自动转账到用户6522222874487848,1999999金额。
    View Code

    2 csrf攻击原理

    3 表单请求csrf攻击防御

        - 表单提交请求防范csrf攻击
            a.原理:
                表单的提交分为两个阶段:表单渲染,表单提交。 只要在表单提交的时候,检验提交的表单是否自己渲染的
                即可
            b.图片概括原理:
    
            c.详细介绍
                后台渲染表单的时候,设置表单隐藏令牌token,
                前端提交数据+令牌token,后台判断表单提交的令牌token是否自己颁发的
    
            - 不要将请求的数据放在get中,而是通过POST/PUT/DELETE,通过表单提交。
            - 表单提交数据,添加一个token
            - 每次表单提交数据时,服务器都要求验证token
            - token隐藏
    View Code

    4 表单请求csrf攻击防御原理图

    5 ajax请求csrf攻击防御

        - ajax请求csrf攻击防御
            a.原理:
                get请求加载页面,+ ajax提交两个阶段。 服务器在响应get请求时设置cookie令牌
                然后ajax请求携带上cookie令牌,后台检验ajax请求的cookie令牌是否自己颁发的即可
    View Code

    6 ajax请求csrf攻击防御原理图

    7 csrf防御方案总结

        - csrf防御的方案:
            服务器颁发一个令牌token,浏览器提交数据时带上令牌,服务器验证令牌是否自己颁发的。
            对于表单提交来说,令牌token存储在表单DOM上,其他站点无法获取到。
            对于Ajax提交来说,令牌token存储在Cookie上,其他站点无法获取到。
    View Code

    8 django form请求csrf防御实例

        - django防范Form表单请求csrf攻击
            a.原理
                - 通过中间件CsrfMiddleWare来进行csrf防护。
                - django渲染表单时,随机生成令牌csrftoken,并设置隐藏在表单上
                - 客户端提交form表单时,会将令牌一起携带
                - 服务器在处理POST数据时,django会验证表单提交的csrfmiddlewaretoken值是否刚才自己设置的token;
                    不一样,返回403 Forbidden,非法请求
            b.样例
                - 使用form请求csrf防御
                     a. settings添加中间件'django.middleware.csrf.CsrfViewMiddleware'
                     b. 在表单上{% crsf_token %}
                     c. 实例
                        #前端
                         <form action="/csrf1.html" method="POST">
                            {% csrf_token %}
                            <input type="text" name="username" placeholder="用户名" id="user">
                            <input type="password" name="pwd" placeholder="密码" >
                            <input type="submit" value="提交">
                        </form>
    View Code

    9 django ajax请求csrf防御实例

        - django防范ajax请求csrf攻击
            a.原理 ajax发送csrf, 消息头携带cookie的csrf
                    获取cookie里面的csrftoken, 并在请求头里面设置X-CSRFToken: csrftoken
                    前端js获取cookie,需要引入插件jquery.cookie.js
    
            b.实例
             settings添加中间件'django.middleware.csrf.CsrfViewMiddleware'
             <form action="/csrf1.html" method="POST">
                <input type="text" name="username" placeholder="用户名" id="user">
                <input type="password" name="pwd" placeholder="密码" >
                <a onclick="submit_ajax()">ajax提交</a>
             </form>
             <script src="/static/js/jquery-1.12.4.js"></script>
             <script src="/static/js/jquery.cookie.js"></script>
             <script>
                    function submit_ajax() {
                    var token = $.cookie('csrftoken');
                    var user = $('#user').val();
                    $.ajax({
                        url: '/csrf1.html',
                        type: 'POST',
                        headers:{'X-CSRFToken': token},
                        data: {'username': user},
                        success: function (arg) {
                            console.log(arg)
                        }
                    })
    
                }
    
            </script>
    View Code


     

  • 相关阅读:
    常用函数集锦
    HDU1212加深下对取模运算的理解
    HDU1022 queue和vector模拟
    设计模式原则
    3.6html学习笔记之样式选择
    poj 1274(二分图最大匹配)
    poj 1469(二分图最大匹配)
    poj 3692(二分图匹配--最大独立集)
    Codeforces Round #230 (Div. 1) 解题报告
    Codeforces Rockethon 2014 解题报告
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7878817.html
Copyright © 2020-2023  润新知