1. ホーム
  2. Python

[Django] CSRF 検証に失敗しました。

2022-02-12 06:53:39

Djangoを使用してPostフォームを送信する際に、以下のエラーが発生しました。

Forbidden (403)
CSRF verification failed. request aborted.






理由は"Help"に明確に書かれています。


一般に、これは本物のクロスサイトリクエストフォージェリがある場合や、Django の CSRF 機構が適切に使われていない場合に起こりえます。POST フォームでは、以下のことを確認する必要があります。

*ビュー関数はテンプレートRequestContextを使用します。

* テンプレート内には、{%csrf_token%}があります。(内部ターゲットの各郵便局のフォームにあるテンプレートURLトークン。

*CsrfViewMiddlewareを使用していない場合は、ビューでcsrf_protectを使用する必要があります。

このページのヘルプセクションが表示されるのは、設定でDEBUG = Trueが設定されているためです。これをFalseに変更すると、最初のエラーメッセージのみが表示されます。CSRF_FAILURE_VIEWの設定により、このページをカスタマイズすることができます。


では、解決策を。

<スパン 1. フォーム Form に

{% csrf_token %}
2.
In the Settings
MIDDLEWARE_CLASSES add configuration: (usually there by default)
'django.middleware.csrf.CsrfViewMiddleware',
 #'django.middleware.csrf.CsrfResponseMiddleware',

1.2.Xの例です。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware,
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware,
)



3. ビューのメソッドの上に@csrf_protectアノテーションを追加します。また、Contextの代わりにRequestContextを使用します。

----------------------------------------------------------------------------------------------------------------------------------

csrf_protect
def login(request):

...

return render_to_response('index.html', context_instance=RequestContext(リクエスト) )

----------------------------------------------------------------------------------------------------------------------------------


詳細はこちら 

https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf




拡張リーディング

django.contrib.csrf  開発用パッケージには、モジュールが1つしかありません。  ミドルウェア.py  . このモジュールには、Django のミドルウェア・クラスである CsrfMiddleware  CSRF保護を実装するクラスです。

設定ファイル内に  'django.contrib.csrf.middleware。  に追加します。  middleware_classes  CSRF保護は、設定で有効にすることができます。ミドルウェアの設定は  セッション・ミドルウェア  が実行されるので、リスト内の  CsrfMiddleware  の中に表示されなければなりません。 セッションミドルウェア  (レスポンスミドルウェアは前後して実行されるため)。また、レスポンスが圧縮・伸張される前に、レスポンス結果を処理する必要があるため  CsrfMiddleware  で設定する必要があります。  GZipミドルウェア  はその後に実行されます。一度追加された ミドルウェア・クラス をセットしたら、作業終了です。