web-dev-qa-db-ja.com

JQuery + AJAX + Django = CSRF?

重複の可能性:
"CSRFトークンが見つからないか正しくありません" AJAX in 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);
        }
    });
});
14
Krzysztof Trzos

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

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

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

10
Arnaud Le Blanc

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

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

もう1つの方法は、レガシーメソッドを使用して'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保護を達成するための正しい方法なのか最も安全な方法なのかわかりません。

3
ElHacker