CSRF无法在django中使用safari私密浏览

时间:2016-11-28 09:34:21

标签: django cookies safari private django-csrf

我无法在safari隐私浏览中将数据发布到我的django webapp(它适用于Chrome隐身版)。

我没有使用localstorage。

我使用

设置X-CSRFToken标头
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(...

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

我使用charles检查了请求,并设置了csrftoken cookie并设置了X-CSRFToken标头。

我注意到隐私浏览中的safari增加了&#34; DNT = 1&#34; (不跟踪)标题,不确定这是否导致问题。 Chrome隐身请求中不存在DNT = 1。

我已在

中记录了Cookie
  

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

使用

logger.debug(request.COOKIES)

并且缺少csrftoken cookie(缺少其他几个cookie)。只打印了4个饼干。如查尔斯所见,初始请求中有13个cookie。

由于没有csrftoken,这会导致

  

禁止访问(未设置CSRF cookie。)403错误。

标题中的DNT = 1是什么?它是否限制了允许的cookie数量?它会阻止某些类型的cookie吗?

1 个答案:

答案 0 :(得分:0)

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

  

https://bugs.python.org/issue27674

如果字符串中有任何引号,则只会导致部分cookie被解码。

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