首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中通过AJAX发布参数时"CSRF令牌丢失或不正确“

问在Django中通过AJAX发布参数时"CSRF令牌丢失或不正确“
EN

Stack Overflow用户
提问于 2011-06-28 13:06:22
回答 14查看 103.4K关注 0票数 81

我试着发布参数,比如

代码语言:javascript
复制
 jQuery.ajax(
        {
            'type': 'POST',
            'url': url,
            'contentType': 'application/json',
            'data': "{content:'xxx'}",
            'dataType': 'json',
            'success': rateReviewResult 
        }
    );

但是,Django返回了Forbidden 403. CSRF verification failed. Request aborted.,我正在使用'django.middleware.csrf.CsrfViewMiddleware',无法找到如何在不损害安全性的情况下防止这个问题。

EN

回答 14

Stack Overflow用户

发布于 2011-06-30 10:42:07

您可以通过两种不同的方式发出AJAX post请求:

  1. 告诉您的视图不要检查csrf令牌。这可以通过使用装饰器@csrf_exempt来完成,如下所示: 从django.views.decorators.csrf csrf_exempt @csrf_exempt def your_view_name(请求):.
  2. 要在每个AJAX请求中嵌入一个csrf令牌,对于jQuery可能是: $(函数() { $.ajaxSetup({ headers:{“X”:getCookie("csrftoken") } });}; 其中,getCookie函数从cookie中检索csrf令牌。我使用以下实现: 函数getCookie(c_name) { if (document.cookie.length > 0) { c_start = document.cookie.indexOf(c_name + "=");if (c_start != -1) { c_start = c_start + c_name.length + 1;c_end = document.cookie.indexOf(";",c_start);如果(c_end == -1) c_end = document.cookie.length;返回未转义(document.cookie.substring(c_start,c_end));}返回“;} 另外,用于访问cookie的jQuery 有一个插件,类似于: // set cookie $.cookie(“炊事名称”,“炊事名称”);//读取cookie var myCookie =$.cookie(“cookiename”);//删除cookie $.cookie(“cookiename”,null);
票数 118
EN

Stack Overflow用户

发布于 2011-07-29 04:10:08

我发现的最简单的方法是在数据中包含{{csrf_token}}值:

代码语言:javascript
复制
jQuery.ajax(
    {
        'type': 'POST',
        'url': url,
        'contentType': 'application/json',
        'data': {
            'content': 'xxx',
            'csrfmiddlewaretoken': '{{ csrf_token }}',
        },
        'dataType': 'json',
        'success': rateReviewResult 
    }
);
票数 58
EN

Stack Overflow用户

发布于 2012-04-30 15:29:18

我花了一段时间才明白丹尼尔发布的代码是怎么处理的。但实际上,您所要做的就是将其粘贴到javascript文件的开头。

对我来说,迄今为止最好的解决办法是:

  1. 创建一个csrf.js文件
  2. 将代码粘贴到csrf.js文件中
  3. 在模板中引用所需的代码

注意,STATIC_PREFIX/js/csrf.js指向我的文件。实际上,我正在用STATIC_PREFIX加载{% get_static_prefix as STATIC_PREFIX %}变量。

高级提示:如果您正在使用模板,并且有类似于base.html的扩展,那么您可以从那里引用脚本,而不必再担心其他文件。据我所知,这也不应该代表任何安全问题。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6506897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档