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);
}
});
});
Ответы
Ответ 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.