1
我在Django中有一個奇怪的CSRF問題。以下是有關部分:Django Ajax 403因爲httponly cookie
在我的JavaScript文件我有:
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$(function() {
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
})
$.post('/api/jpush',
$.param({'recipients': recipients, 'message': message, 'url': url,
'url_title': url_title, 'priority': priority,
'csrftoken': getCookie('csrftoken')}),
...
然後我有我的觀點:
def push(request):
return render(request, 'api/push.html')
def jpush(request):
tmplData = {'result': False}
if not request.POST:
return HttpResponseBadRequest(request)
elif request.POST.viewkeys() & {'recipients', 'message', 'priority'}:
tmplData = { 'results': send(request.POST) }
return JsonResponse(tmplData)
....
,並在我的模板:
<form id="push" class="form-horizontal" action="" method="post">{% csrf_token %}
然而,當我使用ajax後,我得到一個403和螢火蟲顯示我的crsftoken值爲空,並且csrftoken cookie是http只要。我在我的settings.py
中將CSRF_COOKIE_HTTPONLY
設置爲False,所以我不明白cookie爲什麼被強制爲httpOnly。我正在使用Django 1.10。
感謝
你hav e設置'CSRF_COOKIE_HTTPONLY = False'之前的唯一http cookie。嘗試清除您的Cookie並重試。 – Alasdair
是的,我已將它設置在我的'settings.py'文件中,並且我已經清理了幾次cookie,但根據螢火蟲它總是以高回報的方式返回。我試着用'document.cookie'查看cookies,但是它沒有顯示那裏,這證實了螢火蟲顯示的內容。 – echodrome
確保您已重置您的服務器,然後在更改設置後清除Cookie。 – Alasdair