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

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

这是截图:

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

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

【问题讨论】:

    标签: ajax django ember.js django-rest-framework csrf


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2021-12-01
      • 2013-04-14
      • 2020-11-08
      • 2012-11-04
      • 2013-11-16
      • 2019-03-28
      • 2016-04-02
      • 2018-08-25
      相关资源
      最近更新 更多