【发布时间】: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。
我已经在
中记录了 cookiepython2.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 吗?
【问题讨论】:
-
我不想启用或禁用它。如果用户在 safari 中使用私有模式,我希望我的 webapp 能够工作。 DNT 标头似乎改变了 django 处理请求的方式。
标签: django cookies safari private django-csrf