美文网首页
djang_CSRF操作

djang_CSRF操作

作者: 两点半的杂货铺 | 来源:发表于2018-02-03 14:40 被阅读25次

    一、什么是csrf

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。可以理解别人伪造了网站偷了你的cookie,然后进行攻击

    二、django中如何使用

    在django的setting.py文件中,有中间件插件配置变量名MIDDLEWARE,其中有一个'django.middleware.csrf.CsrfViewMiddleware',这就是django中的csrf中间插件,平常我们使用django进行post的请求时,如果不注释'django.middleware.csrf.CsrfViewMiddleware',网站就会403报错,我们如何来开启这个中间件,并解决相应问题

    全局:
    
    中间件 django.middleware.csrf.CsrfViewMiddleware
    
    局部:
    先引用方法:
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    装饰器:
    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
    
    
    • 普通的from提交,{% csrf_token %},会自动在页面生成随机字符串,然后提交给后台:
    <form action="/login/" method="post">
            {% csrf_token %}
            <input name="user" type="text">
            <input name="pwd" type="password">
            <input type="submit">
    </form>
    
    • ajax版本的提交

      image.png

    上面的图中发现,其实我们可以通过获取浏览中的csrftoken字段来验证csrf

     <form action="/login/" method="post">
            {% csrf_token %}
            <input name="user" type="text">
            <input name="pwd" type="password">
            <input type="submit">
            <input id="btn" type="button" value="提交按钮">
        </form>
        <script src="/static/jquery-1.12.4.js"></script>
        <script src="/static/jquery.cookie.js"></script>
    
        <script>
            $(function () {
                $('#btn').click(function () {
                    $.ajax({
                        url:'/login/',
                        type:'POST',
                        data:{"user":'root',"pwd":"root"},
                        headers:{'X-CSRFtoken':$.cookie('csrftoken')},
                        success:function (arg) {
                            alert(arg);
                        }
                    })
                })
            })
        </script>
    
    • 统一添加ajax,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 () {
                $('#btn').click(function () {
                    $.ajax({
                        url:'/login/',
                        type:'POST',
                        data:{"user":'root',"pwd":"root"},
                        headers:{'X-CSRFtoken':$.cookie('csrftoken')},
                        success:function (arg) {
                            alert(arg);
                        }
                    })
                })
            })
        </script>
    ···
    

    相关文章

      网友评论

          本文标题:djang_CSRF操作

          本文链接:https://www.haomeiwen.com/subject/bxluzxtx.html