はじめに
DjangoでリクエストをPOSTする際、formタグに、{% csrf_token %}
が必要だが、
そもそもcsrfとは何か?ということで備忘録にします。
基本的なことですが、ご了承ください。
<div class="card-body">
<h4 class="card-title">コメントを投稿する</h4>
<form method="post" action="{% url 'comment_new' snippet.id %}">{% csrf_token %}
{% bootstrap_form comment_form %}
{% bootstrap_button button_type="submit" content="コメント" %}
</form>
</div>
csrfとは?
csrfとは、「クロスサイトリクエストフォージェリ」。
悪意のある実行を、ログインした人が行うこととする、偽装の処理のこと。
ログインした人はその気が無いのに、勝手に記事やコメントがされることになる。
以下は引用。
ウェブサイトの中には、サービスの提供に際しログイン機能を設けているものがあります。
ここで、ログインした利用者からのリクエストについて、その利用者が意図したリクエストであるかどうかを識別する仕組みを持たないウェブサイトは、外部サイトを経由した悪意のあるリクエストを受け入れてしまう場合があります。
このようなウェブサイトにログインした利用者は、悪意のある人が用意した罠により、利用者が予期しない処理を実行させられてしまう可能性があります。
このような問題を「CSRF(Cross-Site Request Forgeries/クロスサイト・リクエスト・フォージェリ)の脆弱性」と呼び、これを悪用した攻撃を、「CSRF攻撃」と呼びます。
引用: IPA情報処理推進機構
csrf攻撃の対策
上記の対策として、以下の処理を行う。
①ユーザーが画面表示時に、サーバーからトークンを発行する。
②POSTなどの処理をする際には、このトークンが一致していることで、サーバーは処理を受理する。
なるほど、Djangoは上記の処理を行うため、{% csrf_token %}
が必要なんですね。
参考記事
以下の記事も非常に参考になりました。