启用CSRF_COOKIE_SECURE时无法从JavaScript发送发布请求

时间:2019-12-14 11:17:33

标签: django vue.js

API端点:/api/items/具有authentication_classes = (SessionAuthentication, )

在我的Vue.js代码中,我有:

getCookie: function (name) {
    match = document.cookie.match(new RegExp(name + '=([^;]+)'));
    if (match) return match[1];
    return
},
...
saveApiCall: function (data) {
    this.$http.post("/api/items/", data, { headers: { 'X-CSRFToken': this.getCookie('csrftoken') } }).then(function (response) {
        this.close();
    }).catch(function (response) {
        this.form_errors = response.body;
    });
},

但是当我设置以下设置时它不起作用:

CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True

$http.post安全的情况下如何发送此csrftoken请求?

1 个答案:

答案 0 :(得分:0)

按照Django docs

  

如果[{CSRF_COOKIE_HTTPONLY]设置为True,则客户端JavaScript将无法访问CSRF cookie。

     

将CSRF cookie指定为HttpOnly并没有提供任何实际的保护,因为CSRF只是为了防止跨域攻击。如果攻击者可以通过JavaScript读取Cookie,那么就浏览器而言,他们已经在同一个域中,因此他们无论如何都可以做任何自己想做的事情。 (XSS比CSRF大得多。)

只需设置CSRF_COOKIE_HTTPONLY = False(或将其从设置中完全删除,因为这是默认设置),您就应该能够从JavaScript访问它。