14

重複の可能性:
Django で AJAX を介してパラメーターを投稿しているときに、「CSRF トークンが見つからないか正しくない」

ログインデータを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);
        }
    });
});
4

2 に答える 2

11

ここ で 説明 する 方法が あります.

各 ajax リクエストに X-CSRFToken ヘッダーを追加することで構成されます。

これは jQuery.ajaxSend イベントにフックすることで行われるため、すべてが自動的に行われます (コードをコピーして貼り付け、最初の ajax リクエストの前に一度実行するだけです)。

于 2011-08-27T13:44:28.687 に答える
3

私は同じ問題を解決しようとしてきました.arnaud576875が言うように、Djangoドキュメントがhttps://docs.djangoproject.com/en/dev/ref/contribと言うのと同じように、各ajaxリクエストにcsrfトークンヘッダーを追加する必要があります/csrf/#ajaxそして、作成する Ajax リクエストの前にそのコードを実行します。

しかし、追加の何かがあります.AJAXリクエストを実行しようとする前に、csrfトークンをアプリのCookieにロードする方法を見つける必要があります.これ、私が見つけたのは、ビューがクッキー内でcsrfトークンを確実に送信するensure_csrf_token()ために、トークンを受け取りたい各ビューに使用できることですhttps://docs.djangoproject.com/en/dev/ref/contrib /csrf/#django.views.decorators.csrf.ensure_csrf_cookieこれは多くの人にとってうまくいくようですが、私にとってはうまくいきませんでした。

もう 1 つの方法は、Legacy Method を使用して を追加することですが、いくつかのセキュリティ リスクが残るため、この方法は 'django.middleware.csrf.CsrfResponseMiddleware' MIDDLEWARE_CLASSES勧めしません。 https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

私が前に言ったこの方法はすべて私にとってはうまくいきませんでした. 私が Ajax にいくつかのリクエストを許可する方法は次のとおりです。これが危険な方法であると判断した場合は、お知らせください。

  1. /home/ ページなど、ユーザーが最初にヒットするビューに移動します。
  2. 何かをリダイレクトまたは解析する前にこれを挿入します request.META["CSRF_COOKIE_USED"] = True

それが私にとってはうまくいく方法ですが、前に言ったように、これがcsrf保護を達成するための正しい方法なのか、最も安全な方法なのかはわかりません.

于 2011-08-28T00:09:36.523 に答える