Ошибка 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.

Другие вопросы по тегам