【发布时间】:2018-01-21 18:24:09
【问题描述】:
我的基本目标是将一些数据从 chrome 插件发送到 Django 服务器。到目前为止,我的基本尝试如下所示:
-
使用 javascript 在插件代码中捕获数据。
loginData = { 'username': document.getElementById("login-email").value, 'password': document.getElementById("login-password").value }; -
使用 REST 框架将其发送到 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 插件“域”内),因此无法访问我的 cookie(这是正确的)。
他们在该文档中进一步提到“如果您激活 CSRF_USE_SESSIONS,则必须在 HTML 中包含 CSRF 令牌并使用 JavaScript 从 DOM 中读取令牌。”但是,在您的 HTML 中包含该标记不是完全违背了 CSRF 标记的目的吗? IE。它允许攻击者端点获取有效的 CSRF 令牌,然后他们可以使用该令牌执行恶意攻击,对吗?
我还研究了能够get the cookie value directly from the AJAX response,但它也被阻止以防止我正在尝试执行的确切类型的“攻击”。
当我检查流量时,我确实看到名为“csrftoken”的 cookie 与我的请求一起发送,所以我想我也有点困惑 Django 为什么/如何希望我将其拉出到 HTTP header 而不是仅仅从已经发送的 cookie 中读取它。
所以,我猜,有两个问题:
- 在 HTML 中包含 CSRF 令牌的 Django 不是完全违背了所述 CSRF 令牌的目的吗?
- 在不打开 Chrome 扩展程序的安全漏洞的情况下向远程 API 提交数据的方法是什么?
【问题讨论】:
-
Re: 从另一个域获取cookie,可以使用chrome.cookies API。
标签: javascript ajax django cookies google-chrome-extension