CSRF 不能在 django 中使用 safari 私人浏览

CSRF not working in django with safari private browsing

我无法 POST 在 safari 隐私浏览中向我的 django webapp 发送数据(它适用于 Chrome 隐身模式)。

我没有使用 localstorage。

我使用

设置 X-CSRFToken header
var csrftoken = NMA.getCookie('csrftoken');
$.ajax({
    type:"POST",
    contentType: 'application/json; charset=utf-8',
    beforeSend: function (request, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain){
            request.setRequestHeader("X-CSRFToken", csrftoken);
        }
    },
    url: "/profiler/logAnswers/
    data: payload,
    dataType: 'json'
}).done(...

csrftoken cookie 是使用 {% csrf_token %} 设置的,隐藏的输入存在于 <form>

我已经使用 charles 检查了请求,并且设置了 csrftoken cookie,并且设置了 X-CSRFToken header。

我注意到私人浏览中的 safari 将 "DNT = 1"(不跟踪)添加到 header,不确定这是否导致问题。 chrome 隐身请求中不存在 DNT=1。

我已经在

中记录了 cookie

python2.7/site-packages/django/middleware/csrf.py

使用

logger.debug(request.COOKIES)

并且 csrftoken cookie 丢失(并且其他几个 cookie 丢失)。只打印了 4 个饼干。如 charles 中所示,初始请求中存在 13 个 cookie。

由于没有 csrftoken,这会导致

Forbidden (CSRF cookie not set.) 403 error.

header 中的 DNT=1 有什么作用?它是否限制允许的 cookie 数量?它会阻止某些类型的 cookie 吗?

问题是(为了绕过 localstorage 不可用)我有 json 个对象保存在 cookie 中。存在 python 错误或问题:

https://bugs.python.org/issue27674

如果字符串中有引号,则只会解码部分 cookie。

所以解决方案是替换所有 cookie 中的引号