首页 文章

如何在Chrome插件/其他来源中使用CSRF令牌

提问于
浏览
1

我的基本目标是将一些数据从chrome插件发送到Django服务器 . 到目前为止我的基本尝试看起来像这样:

  • 使用javascript捕获插件代码中的数据 .
loginData = {
    'username': document.getElementById("login-email").value,
    'password': document.getElementById("login-password").value
};
  • 使用REST Framework将此发送到Django .
csrfToken = getCookie('csrftoken');

$.ajax(login_url, {
    type: 'post',
    data: JSON.stringify(loginData),
    contentType: 'application/JSON',
    dataType: 'json',
    headers: {
        'HTTP_X_CSRFTOKEN': csrfToken
    },
    success: function (data, status, XhrObj) {
        // Do some stuff
    },
    error: function (XhrObj, status, error) {
        // Do some other stuff
    }
});

我遇到错误的地方是我一直得到错误响应 {"detail":"CSRF Failed: CSRF token missing or incorrect."} 我试图关注the instructions listed in Django's documentation for adding the CSRF header into requests,但是他们声明的 getCookie 函数总是返回null,因为我在Chrome插件"domain"中的页面是'm doing this from is not from that domain (remember it',因此无法访问到我的 Cookies (理所当然) .

此外,在该文档中,他们提到“如果激活CSRF_USE_SESSIONS,则必须在HTML中包含CSRF令牌,并使用JavaScript从DOM中读取令牌 . ”但是,在HTML中不包含该令牌会完全违背CSRF令牌的目的吗?即它允许攻击者 endpoints 获取有效的CSRF令牌,然后他们可以使用它来执行恶意攻击,对吗?

我也调查了能够get the cookie value directly from the AJAX response,然而这也被阻止以防止我试图做的确切类型"Attack" .

我确实看到当我检查流量时,我的请求发送了名为'csrftoken'的cookie,所以我想我也有点困惑为什么/如何Django希望我把它拉到HTTP头而不是只是从已经发送的cookie中读取它 .

所以,我想,有两个问题:

  • Django包含HTML中的CSRF令牌是否完全违背了所述CSRF令牌的目的?

  • 如何在不从Chrome扩展程序中打开安全漏洞的情况下向远程API提交数据的方法是什么?

1 回答

  • 0

    所以我实际上最终解决了这个问题(虽然@wOxxOm指出了我正确的方向) .

    需要更改2件才能使其正常工作:

    • 而不是使用Django建议的获取cookie的方式,我不得不使用wOxxOm建议的chrome.cookies API .

    • 将http标头从 HTTP_X_CSRFTOKEN 更改为 X-CSRFToken .

    感谢您的帮助,希望这有助于其他人!

    另外,关于我的第一个问题,结果是表单中的CSRF令牌只包含在cookie中的CSRF令牌的哈希中,并且两个表单都必须存在于django生成的表单中才能通过CSRF验证, as documented in the Django documentation .

相关问题