django 程序ajax提交的方法,避免csrf错误
来源:互联网 发布:淘宝申请退款 编辑:程序博客网 时间:2024/04/30 08:22
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' ,为了安全起见,用上面的第三种方法。
不过不用 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' ,为了安全起见,用上面的第三种方法。
0 0
- django 程序ajax提交的方法,避免csrf错误
- Phalcon ajax防 csrf 提交方法
- Django提交表单时遇到403错误:CSRF verification failed
- Django Ajax with CSRF
- Django Ajax CSRF 认证
- django 对于csrf错误的处理
- CSRF攻击原理&Django的应用方法
- Django CSRF设置方法
- 避免重复提交的方法
- 怎样避免频繁的Ajax提交
- Django-CSRF的理解
- Django 对于CSRF verification failed.错误的解决方法
- Django POST常见的错误:CSRF verification failed. Request aborted.
- Django POST常见的错误:CSRF verification failed. Request aborted.
- 解决Django 提交表单时403错误:CSRF verification failed. Request
- Django提交表单出现403错误,CSRF verification failed. Request aborted .
- 解决Django 提交表单时403错误:CSRF verification failed. Request aborted .
- django中post提交表单时错误:CSRF verification failed. Request aborted
- Mysql权限管理白皮书
- ibatis简单入门
- CRC学习笔记
- 解决领取红包产生并发的几个小方法
- 英文
- django 程序ajax提交的方法,避免csrf错误
- eclipse快捷键
- HIVE中MAPJOIN可以使用的场景分析
- Eclipse构建Maven项目
- VC++启动RTTI
- 重构机房收费系统2之错误异常“System.AccessViolationException”类型
- java 实现获取本机 字体包
- Android自定义控件背景及其Drawable以实现扁平化
- cocos2dx-lua中如何使用自定义类以及tolua++的使用