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

摘要: django为了安全起见,加入 csrf_token , 由此可以避免恶意提交,大家熟悉的workpress,用过的人都知道,每天都有很多垃圾评论,留言。管理很麻烦,虽然有插件可以过滤,但也不是很好。不过不用 django ajax 提交,为了避免出现 csrf toke 错误,可以采取以下方法

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 里加上
{% csrf_token %} ......


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

以上都不是ajax方式提交的,如果是ajax方式,上面的第三种方式是不可以的,如果要想第三种方法也可以用,可以加入一个js文件。在你的html 页面里面加入这个js的引用,就可以做到
比如:
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' ,为了安全起见,用上面的第三种方法。

上一篇: python两个 list 获取交集,并集,差集的方法.
下一篇: java jdbc连接各种数据库的方式大全

Avatar

Muyi 评论于: 2015-11-30

您好,能给一个用第三种方法ajax提交的简单事例吗?我把这段代码引用了之后还是出现csrf问题,我去django官网也没找到好的结果。设置了这个之后审查元素看还是没有cookies,更别说csrf_token了,不知道为什么。
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号