Ошибка Django CSRF с AJAX на iOS 8
Я пытаюсь сделать AJAX-вызов функции Django, но начал получать ошибку проверки CSRF в iOS 8. Он работает с последней версией iOS и используется для работы с iOS 8.
Это может быть связано с последними обновлениями TLS. Мой хост недавно устарел TLS 1.0 и TLS_RSA_WITH_3DES_EDE_CBC_SHA.
Я добавляю токен CSRF в качестве параметра записи. Если я сделаю функцию (на стороне сервера) @csrf_exempt, вызов сработает, но я, очевидно, не хочу отнимать безопасность.
Я проверял это только в Safari. Я использую Django 1.5.2.
HTML:
# this creates an input with the CSRF token as its value
<div id = "csrf_token" class = "hidden">{% csrf_token %}</div>
Javascript:
csrfmiddlewaretoken = $('#csrf_token input').val();
$.ajax({
type: "POST",
url: "<my_url>",
data: {"csrfmiddlewaretoken":csrfmiddlewaretoken},
success: function(data){
alert("ok");
}
,error: function(xhr, status, error) {
alert("error " + xhr.responseText);
}
});
Есть ли какое-то решение этого или я должен прекратить поддержку iOS 8? У меня все еще есть пользователи, которые его используют.
1 ответ
Проблема оказалась в том, что реферер не был передан в iOS 8, что приводит к сбою CSRF. Referer не был передан, потому что страница использовала метатег referrer.
<meta name="referrer" content="always">
<meta name="referrer" content="unsafe-url">
Это не работает в iOS 8.