jQueryを使ったAjaxでDjangoのCSRFを有効にする方法

DjangoにはCSRF(クロスサイトリクエストフォージュエリ)用のMiddlewareがあらかじめ用意されています。これをAjaxでも試してみて問題なさそうだったのでメモしておきます。

  1. 「settings.py」の「MIDDLEWARE_CLASSES」に「django.middleware.csrf.CsrfMiddleware」を追加する。
  2. 「settings.py」の「CSRF_COOKIE_NAME」に適当な値を設定(デフォルト値: csrftoken)
  3. 「form」タグを用意し、メソッドを「post」に変更
  4. 「form」タグの中に「{% csrf_token %}」を記述
  5. viewにてのインポート文「from django.views.decorators.csrf import csrf_protect」と、対象の関数にデコレータ「@csrf_protect」を追加
  6. AjaxでPOSTするパラメータに、「csrfmiddlewaretoken」の値を追加

なお、トークンのチェックに引っかかった場合は403が返ります。(カスタマイズ可能)

jQueryにおける6の例)

※ バージョンによって出力されるタグの形式が違うみたいです。GAEをやめる場合のCSRFの注意点

$.ajax({
  datatype: "json",
  data: {
    "csrfmiddlewaretoken": $("#csrfmiddlewaretoken").val()
  },
  type: "POST",
  etc…

※ 「@csrf_protect」はデフォルトで聞いているみたいです。逆にチェックしない場合には「csrf_exempt」を付け加えます。

この記事が役に立った場合、シェアしていただけると励みになります!!