1. ホーム
  2. パイソン

403 Forbidden. "CSRF トークンがないか不正確です" 応答処理ソリューション

2022-03-02 17:52:19
<パス

Django プロジェクトの settings.py にある django.middleware.csrf.CsrfViewMiddleware ミドルウェアは、 Django にデフォルトで csrf 認証を提供します。
ミドルウェアはcsrf_tokenをクッキーに設定し、実際には暗号化されていないcsrf_tokenをセッションに格納し、生成されたセッションID番号をクッキーに格納します。


settings.py ファイルに django.middleware.csrf.CsrfViewMiddleware が存在するかどうかを判定します。


ajax送信リクエスト

jsで、cookieからcsrf_tokenを取得し、それをajaxリクエストヘッダに追加します。

// Regularly match the csrftoken in the cookie, passing in the cookie name
function getCookie(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : undefined;
}

    $.ajax({
	...
	headers: {
	    "X-CSRFToken": getCookie("csrftoken") 
	},
	....


<form action="/" method="post">
    {% csrf_token %}
    ...


<イグ


フォーム送信

フォームに{% csrf_token %}を追加します。

<form action="/" method="post">
    {% csrf_token %}
    ...



バリデーション処理。

  1. リクエストヘッダ/(フォーム)でcsrf_token(暗号化)を取得し、secret_keyで復号してcsrf_tokenを取得します。

  2. csrf_token(非暗号化)を、CookieのsessionIDを介して、サーバー内部に保存されているセッションから取得する。

  3. 2つの値を比較する