django进阶(九)之csrf设置

csrf基础设置

settings.py
中间件设置:之前由于配置post登陆的时候报403错误,把图中画红框的部分注释掉才能使用,这次将其注释去掉,并配置能访问

 

csrf原理:
    客户端在提交get请求数据的时候,服务端不进会给客户端数据,还会给客户端一个字符串(加密的,只有服务端能反解),客户端提交数据的时候只有带着这个字符串一起提交,服务端才允许提交,否则不允许提交,相当于多了一层保护

 

去掉注释后的前端配置()

添加csrf_token,然后将这个随机的字符串在提交数据的时候一起提交给服务端

添加完后提交一次,发现cookies中有这个csrf_token,提交数据时我们需要将这个token返回给服务端

 

 

 通过ajax请求去实现token和数据的提交

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/common.css">
    <style>
        label{
            width: 100px;
            display: inline-block;
            text-align: center;
        }

    </style>
</head>
<body>
    <form action="/cmdb/login/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p>
            <label for="username">用户名:</label>
            <input id="username" name="user" type="text"/>
        </p>
        <p>
            <label for="password">密码:</label>
            <input id="password" name="password" type="password"/>

        </p>
        <p>
            <input type="checkbox" name="rmb" value="1">10秒免登陆
        </p>
        <p>
            <input id="tj" type="submit" value="提交"/>
            <span style="color: red">{{ error_msg }}</span>
        </p>
    </form>
    <script src="/static/jquery-3.2.1.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>
        $(function () {
            $.ajaxSetup({       //xhr --> xmlhttprequest对象
                beforeSend:function (xhr,settings) {
                    xhr.setRequestHeader('X-CSRFtocken',$.cookie('csrftoken'))
                }
            });
            
            $('#tj').click(function () {
                $.ajax({
                    url:'/cmdb/login',
                    type:"POST",
                    data:{'username':'root','password':'123456'},
                   // headers:{'X-CSRFtocken':$.cookie('csrftoken')},    //由于所有的post请求都要加headers,会很麻烦,所以用最上面的
                    success:function (obj) {
                        
                    }
                })
            })
        })
    </script>
</body>
</html>

 

 

通过中间件设置csrf

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

 

全局:

  •   中间件 django.middleware.csrf.CsrfViewMiddleware

 

局部:

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

 

示例

 

另一种方法:在模版语言里(html)设置

<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) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
        function Do(){
  
            $.ajax({
                url:"/app01/test/",
                data:{id:1},
                type:'POST',
                success:function(data){
                    console.log(data);
                }
            });
  
        }
    </script>

 

 

posted @ 2018-05-03 11:40  FRESHMANS  阅读(598)  评论(0)    收藏  举报