您的位置:首页 > 编程语言 > Go语言

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

2015-10-17 00:16 471 查看
注:以下内容转载自 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: