【问题标题】:CSRF not working in django with safari private browsingCSRF 无法在 django 中使用 safari 隐私浏览
【发布时间】:2016-11-28 09:34:20
【问题描述】:

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

我没有使用本地存储。

我使用设置 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(...

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

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

我注意到隐私浏览中的 safari 在标题中添加了“DNT = 1”(不跟踪),不确定这是否是导致问题的原因。 chrome 隐身请求中不存在 DNT=1。

我已经在

中记录了 cookie

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

使用

logger.debug(request.COOKIES)

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

由于没有 csrftoken 这会导致

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

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

【问题讨论】:

标签: django cookies safari private django-csrf


【解决方案1】:

问题是(为了避免 localstorage 不可用)我将 json 对象保存在 cookie 中。存在 python 错误或问题:

https://bugs.python.org/issue27674

如果字符串中有任何引号,则只会对部分 cookie 进行解码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2016-06-07
    • 2013-09-22
    • 2018-01-25
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多