document.cookie 中 csrftoken 的值与 Cookies 中的 csrftoken 不同

Posted

技术标签:

【中文标题】document.cookie 中 csrftoken 的值与 Cookies 中的 csrftoken 不同【英文标题】:Value of csrftoken in document.cookie is different from csrftoken in Cookies 【发布时间】:2016-11-10 03:02:21 【问题描述】:

我正在使用 django rest 框架。我有 Ember 前端。在这里,当我从 Cookies.get("csrftoken") 获取 csrftoken 时,它与我在浏览器 cookie 中看到的 csrftoken 不同。

这是截图:

看到Cookie中的csrftoken与X-CSRFToken不同(由Cookies.get("csrftoken")设置)。

为什么它们不同?我需要他们两个是一样的。请帮忙。

【问题讨论】:

【参考方案1】:

您应该在发送请求之前手动设置X-CSRFToken。 Django docs 包含一个很好的例子: https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax

它是关于 JQuery 的,但你应该掌握这个想法:

function csrfSafeMethod(method) 
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

$.ajaxSetup(
    beforeSend: function(xhr, settings) 
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) 
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        
    
);

想法如下:服务器向您发送 cookie 中的 csrf-token,您的客户端读取 cookie 并在标头中设置令牌。服务器读取请求标头,查看好的X-CSRFToken 并知道该请求是有效的。

【讨论】:

是的。我知道的。我就是这么说的。设置X-CSRFToken后,csrf和我在cookies中看到的不一样。 抱歉,您没有告诉您将 csrf-token 设置为 X-CSRFToken 标头。只是您从 cookie 中读取它,这与 Ember 发送的 X-CSRFToken 值不同。可能我理解错了。【参考方案2】:

在 django 1.10 中。为了防止 BREACH 攻击,CSRF 保护机制现在更改每个请求的表单令牌值(同时保持可用于验证不同令牌的不变秘密)。 也许你的 Django 版本是 1.10docs

【讨论】:

以上是关于document.cookie 中 csrftoken 的值与 Cookies 中的 csrftoken 不同的主要内容,如果未能解决你的问题,请参考以下文章

关于document.cookie的使用

关于document.cookie的使用

JS中无法从document.cookie访问cookie,但浏览器显示cookie存在

在贴吧页面调用控制台 输入:document.cookie 或使用代码:javascript:document.write(document.cookie)

http_only = false 时不在 document.cookie 列表中的 cookie

无法在 Phonegap iOS 的 document.cookie 中设置域?