如何在Chrome插件/来自其他来源

时间:2017-08-13 23:03:05

标签: javascript ajax django cookies google-chrome-extension

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

  1. 使用javascript捕获插件代码中的数据。

    loginData = {
        'username': document.getElementById("login-email").value,
        'password': document.getElementById("login-password").value
    };
    
  2. 使用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
        }
    });
    
  3. 我遇到的问题是我不断收到错误回复{"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插件“域”内),因此无法访问我的cookie(理所当然)。

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

    我也考虑过能够get the cookie value directly from the AJAX response,但是这也被阻止以防止我试图做的确切类型的“攻击”。

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

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

    1. 在HTML中包含CSRF令牌的Django是否完全违背了所述CSRF令牌的目的?
    2. 如果不从Chrome扩展程序中打开安全漏洞,将数据提交到远程API的方法是什么?

1 个答案:

答案 0 :(得分:0)

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

需要更改以使其正常工作的两件事:

  1. 我不得不使用Django建议的获取cookie的方式,而是按照wOxxOm的建议使用chrome.cookies API
  2. 将http标头从HTTP_X_CSRFTOKEN更改为X-CSRFToken
  3. 感谢您的帮助,希望这有助于其他人!

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