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

django 程序ajax提交的方法,避免csrf错误

2014-06-16 16:07 260 查看
django为了安全起见,加入 csrf_token , 由此可以避免恶意提交,大家熟悉的workpress,用过的人都知道,每天都有很多垃圾评论,留言。管理很麻烦,虽然有插件可以过滤,但也不是很好。

不过不用 django ajax 提交,为了避免出现 csrf toke 错误,可以采取以下方法:

1. settings.py 中 MIDDLEWARE_CLASSES 中 注释掉'django.middleware.csrf.CsrfViewMiddleware'

2. 在你的views.py 的方法上加上 @csrf_exempt 装饰 (需要 from django.views.decorators.csrf import csrf_exempt)

3. 在你的views.py中方法上这样使用:


程序代码

context={}

context.update(csrf(request))

context['mycontent']='aaaa'

.....

return render_to_response('form.html',context)

那么在form.html这个模板里面就必须要有csrf_toke 这个隐藏字段,所以必须在form 里加上


程序代码

<form action='.'>

{% csrf_token %}

<input name="your_name" />

......

这样提交的时候,才不会报csrf_toke 错误.

以上都不是ajax方式提交的,如果是ajax方式,上面的第三种方式是不可以的,如果要想第三种方法也可以用,可以加入一个js文件。在你的html 页面<head>里面加入这个js的引用,就可以做到

比如:<script type="text/javascript" src="/static/js/jquery/mycookies.js"></script>

mycookies.js 内容如下,其实就是操作 cookies.


程序代码

/*====================django ajax ======*/

jQuery(document).ajaxSend(function(event, xhr, settings) {

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;

}

function sameOrigin(url) {

// url could be relative or scheme relative or absolute

var host = document.location.host; // host + port

var protocol = document.location.protocol;

var sr_origin = '//' + host;

var origin = protocol + sr_origin;

// Allow absolute or scheme relative URLs to same origin

return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||

(url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||

// or any other URL that isn't scheme relative or absolute i.e relative.

!(/^(\/\/|http:|https:).*/.test(url));

}

function safeMethod(method) {

return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

}

if (!safeMethod(settings.type) && sameOrigin(settings.url)) {

xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));

}

});

/*===============================django ajax end===*/

以上几种方法,都可以实现csrf错误的避免,还能用ajax方式提交. 不过个人推荐用 加载js文件方式,而且开启:'django.middleware.csrf.CsrfViewMiddleware' ,为了安全起见,用上面的第三种方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: