我的基本目标是将一些数据从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插件“域”内),因此无法访问我的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中读取它。
所以,我想,有两个问题:
答案 0 :(得分:0)
所以我实际上最终解决了这个问题(虽然@wOxxOm指出了我正确的方向)。
需要更改以使其正常工作的两件事:
HTTP_X_CSRFTOKEN
更改为X-CSRFToken
。感谢您的帮助,希望这有助于其他人!
另外,关于我的第一个问题,事实证明,CSRF令牌只包含在cookie中的CSRF令牌的哈希表单中,并且两种表单都必须存在于django生成的表单中才能通过CSRF验证,as documented in the Django documentation。