Подтвердить что ты не робот

JQuery + AJAX + Django = CSRF?

Возможный дубликат:
"Идентификатор CSRF отсутствует или неверен" . а параметр post через AJAX в Django

Я хотел отправить данные AJAX для аутентификации пользователя, но это было невозможно из-за CSRF. Не могли бы вы рассказать мне, что добавить в мой код, чтобы сделать его вокалом?

мой файл JavaScript:

$("#login").live("click", function() {
    var username = $(".login_username").val();
    var password = $(".login_password").val();

    $.ajax({
        url: "/login",
        type: "POST",
        data: {
            username: username,
            password: password
        },
        cache: false,
        success: function(tekst) {
            alert(tekst);
        }
    });
});
4b9b3361

Ответ 1

Существует метод описанный здесь.

Он состоит из добавления заголовка X-CSRFToken для каждого запроса ajax.

Это делается путем подключения к событию jQuery.ajaxSend, поэтому все делается автоматически (вам просто нужно скопировать и пропустить их код и запустить его один раз перед первым запросом ajax).

Ответ 2

Я пытаюсь решить ту же проблему. И поскольку arnaud576875 говорит, что вам нужно добавить заголовок маркера csrf для каждого запроса ajax, как и в документах Django, говорит https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax И выполните этот код перед любым запросом Ajax.

Но есть что-то дополнительное, вам нужно найти способ загрузить токен csrf в файлы cookie вашего приложения, прежде чем пытаться выполнить любой запрос AJAX, после долгих научных исследований, которые я не нашел, я не смог найти конкретный ответ как это сделать, то, что я нашел, заключается в том, что для того, чтобы ваш взгляд отправил токен csrf в файл cookie, вы можете использовать ensure_csrf_token() для каждого представления, которое хотите получить токен https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie кажется, что это работает для многих людей, но не сработало для меня.

Другой способ - использовать Legacy Method, добавив 'django.middleware.csrf.CsrfResponseMiddleware' к вашему MIDDLEWARE_CLASSES, но я не рекомендую этот метод, потому что оставляет несколько угроз безопасности. https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

Все эти методы, о которых я говорил раньше, не работали для меня. Способ, которым я разрешаю Ajax выполнять некоторые запросы, выглядит следующим образом: если кто-то обнаружит этот опасный метод, сообщите мне:

  • Перейдите к первому представлению, которое ваш пользователь ударит, например /home/page.
  • Вставьте это перед перенаправлением или анализом чего-либо request.META["CSRF_COOKIE_USED"] = True

И что это, это способ, который работает для меня, но, как я уже сказал, я не уверен, что это правильный метод или самый безопасный для защиты csrf.