CSRF # 表示django全局发送post请求均需要字符串验证
功能:防止跨站请求伪造的功能
工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端下次访问服务器
端时,服务器端会到客户端查找先前返回的字符串,如果找到则继续,找不到就拒绝。
访问流程:客户端-》URL路由系统 - 》 CSRF -》视图函数
需要在客户端页面的post表单内添加:{% csrf_token %}
全局生效:
  中间件 django.middleware.csrf.CsrfViewMiddleware
局部生效:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
写法如下:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def index(request): # 这样表示此函数取消CSRF验证
实例:登录页面通过ajax进行form表单提交
  <body>

    <div class="container">

      <form id='logfrom' class="form-signin">
       {% csrf_token %}
        <h2 class="form-signin-heading">主机管理页面</h2>
        <label for="inputusername" class="sr-only">用户名</label>
        <input type="text" id="inputusername" class="form-control" name="uname" placeholder="username" required="" autofocus=""><span class="nameinfo hide">用户名错误</span>
        <label for="inputPassword" class="sr-only">密码</label>
        <input type="password" id="inputPassword" class="form-control" name="upwd" placeholder="Password" required=""><span class="pwdinfo hide">密码错误</span>
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> Remember me
          </label>
        </div>
        <input id='login' class="btn btn-lg btn-primary btn-block" type="button" value="登录">
      </form>

    </div> <!-- /container -->


    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="/static/ie10-viewport-bug-workaround.js"></script>
    <script src="/static/jquery-1.12.4.min.js"></script>
    <script src="static/jquery-cookie/jquery.cookie.js"></script>
    <script>
        $('#login').click(function () {
            //以下的ajaxSetup为全局的csrf设置
            $.ajaxSetup({
//             xhr为XmlHttpRequest 对象,是一个固定写法
            beforeSend: function (xhr, settings) {
                /*这里settings代表下面将要执行的ajax里面的内容*/
//                以下表示设置请求头
                xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
            }
        });

            $.ajax({
                url:'/index',
                type:'post',
                data:{'logname':$('#inputusername').val(),'logpwd':$('#inputPassword').val()},
                success:function (data) {
                    if (data == 'ok'){
                        location.href = '/index'
                    }if(data == 'nmerr'){
                        $('.nameinfo').removeClass('hide');
                    }if(data =='pwderr'){
                        $('.pwdinfo').removeClass('hide');
                    }
                }
            })
        })
    </script>
    </body>
View Code

相关文章:

  • 2021-08-15
  • 2021-08-15
  • 2021-08-15
  • 2021-08-15
  • 2021-08-15
  • 2021-08-15
  • 2019-12-28
  • 2021-08-15
猜你喜欢
  • 2021-06-02
  • 2018-10-08
  • 2018-10-09
  • 2021-10-19
  • 2021-08-15
  • 2021-08-15
  • 2021-08-15
相关资源
相似解决方案