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 不同的主要内容,如果未能解决你的问题,请参考以下文章
JS中无法从document.cookie访问cookie,但浏览器显示cookie存在
在贴吧页面调用控制台 输入:document.cookie 或使用代码:javascript:document.write(document.cookie)