Django跨站伪造请求保护措施设置方法

来源:互联网 发布:数据接口开发 编辑:程序博客网 时间:2024/04/30 08:20

       注:以下内容转载自 Django跨站伪造请求保护措施设置方法 一文,仅供学习使用。

        在 Django 建站中遇到 POST 提交表单提示 403 错误,发现以 POST 方式提交表单会触发 Django 内置的 csrf 保护机制,并且在 403 页面给出了解决方法,根据提示更改后发现问题依旧,网上查阅很多同学的解决方案均不能解决这个问题,所以到官网上查阅了关于csrf部分的具体设置,最后成功解决了这个问题。

        官方csrf部分设置翻译:

       CSRF设置步骤:

       第一步:在 settings.py 中的 MIDDLEWARE_CLASSES 部分添加'django.middleware.csrf.CsrfViewMiddleware',如果使用普通方式创建的 Django 项目,这一项一般都已经存在了不用额外设置。如果你不希望加入 csrf 的中间件,那么可以在 views 中的方法上加上 csrf_protect() 装饰器方法,这一步不是必须设置的,网上有很多人都在启用了中间件的同时也加上了 csrf_protect() 方法,导致问题依旧,官方文档上明确写到了这一步是【Alternatively】。

       第二步:在 POST 表单的 template 中加入 csrf_token。这一步很简单,在模板中添加如下代码:

<form action="." method="post">{% csrf_token %} 
       需要注意的一点是,表单提交路径如果是外部链接则不需要添加 csrf token 。

       第三步:在请求处理方法中添加 context processor。

       这一步有两种方式实现:

       方法1:使用 RequestContext,RequestContext 始终都使用了'django.core.context_processors.csrf'。If you are using generic views or contrib apps, you are covered already, since these apps use RequestContext throughout.(这一段还没搞明白,大致意思猜想是普通views或内置的contrib下的应用时,那么已经使用了这种方式来处理 csrf 请求了,不需要额外处理了)

       方法2:手动添加 csrf 处理(我使用的这一种能成功访问)。示例代码如下:

from django.core.context_processors import csrf  from django.shortcuts import render_to_response    def my_view(request):      c = {}      c.update(csrf(request))      # ... view code here      return render_to_response("a_template.html", c) 

       在第一次按照自己的设想将如上代码加入到 view 中时,发现问题依旧,后来将前两行代码放置在方法开始位置后,成功解决问题,由此推测该示例代码的前两行只能放在第一次使用 request 对象之前。

       Django 中使用 Ajax 请求的 CSRF 设置:

       将官方文档上的 ajax 设置照搬下来:

    function getCookie(name) {          var cookieValue = null;          if (document.cookie && document.cookie != '') {              var cookies = document.cookie.split(';');              for (var i = 0; i < cookies.length; i++) {                  var cookie = jQuery.trim(cookies[i]);                  // Does this cookie string begin with the name we want?                  if (cookie.substring(0, name.length + 1) == (name + '=')) {                      cookieValue = decodeURIComponent(cookie.substring(name.length + 1));                      break;                  }              }          }          return cookieValue;      }      var csrftoken = getCookie('csrftoken');            function csrfSafeMethod(method) {          // these HTTP methods do not require CSRF protection          return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));      }      $.ajaxSetup({          crossDomain: false, // obviates need for sameOrigin test          beforeSend: function(xhr, settings) {              if (!csrfSafeMethod(settings.type)) {                  xhr.setRequestHeader("X-CSRFToken", csrftoken);              }          }      });  

       这里使用的是 jQuery,于是可以使用 jQuery 来正常发送 ajax 请求,如:

    $(document).ready(function(){              $("#postBtn").click(function(){                  $.post('/ajax/aPost/', {id:'0001'}, function(data){                       alert(data);                  })              });          }      );  

       GET 请求就不赘述了,同理,本文主要问题在于设置 csrf 说明,使用 Django版本为1.4.3,jQuery版本为1.8.0

0 0
原创粉丝点击