Django|フォームをCSRF攻撃から守る方法|CSRF verification failed. Request aborted.
記事No.68
更新日時2023年03月11日
■記事ページを表示中
記事No.68
更新日時2023年03月11日
CSRF verification failed. Request aborted.
CSRF(クロスサイトリクエストフォージェリ)verification(確認)failed(失敗)。
Request aborted(リクエストを中止します)。
つまり、CSRF攻撃をされていないか確認しようとしたが、確認できなかった。という事です。
フォームにCSRFトークンを設定する事で、このエラーを解消する事ができます。
予備知識として、先にCSRF攻撃について軽く説明します。
CSRF(Cross Site Request Forgeries)攻撃とは、具体的な例をあげて説明すると、
Cross(交配)Site(サイト)Request(リクエスト)Forgeries(偽造)
私達(登場人物1)のサイト内に設置されたフォーム(<form>タグで囲まれた部分)が、私達を攻撃する人(登場人物2)が作成したサイト(攻撃サイト)で使われる事で起こります(<form>タグをコピーペーストすれば使えます)。
攻撃サイトにアクセスしたユーザー(登場人物3)が、その攻撃サイトのフォームから送信すると、私達のサーバーにデータが送られてきます。
仮に、私達が「猫に関する」アンケートフォームを作成したとします。このフォームがCSRF攻撃によって「犬に関する」アンケートフォームに偽造された場合、私達は犬のアンケート結果を受け取ってしまいます。
CSRFトークンが設定されたフォームとは、以下のようなものです。
<form action="/example/" method="post"> <input type="hidden" name="csrfmiddlewaretoken" value="cdwEbIVXnaR678ndL3XyUqxro4MqRZSZgiaajensltgplcIBdWmwUClQrmv0AL0X"> <input type="text" name="searchword" class="form-control" required id="id_searchword"> <input type="submit" value="click"> </form>
nameを見ると、csrfmiddlewaretokenとあり、valueにはランダムな文字列が設定されています。
valueに設定されている文字列がCSRFトークンです。
Djangoはフォームが設置されているサイトにアクセスがある毎に、ランダムに生成されたCSRFトークンをフォームに埋め込みます。
そして、サイトのユーザーによってフォームが送信された際、埋め込んでおいたCSRFトークンも回収します。回収後、生成したCSRFトークンリストと、回収したCSRFトークンを照合します。
照合した結果、回収したCSRFトークンがリストにあった場合、CSRF攻撃がされていないと判断します。
ですので、
CSRF verification failed. Request aborted.
となった場合、まずは、CSRFトークンがフォームに設定されているかを確認します。
もし、CSRFトークンが設定されていなかった場合、HTMLテンプレート内の<form>タグ内に{% csrf_token %}を追記します。
<form action="/example/" method="post"> {% csrf_token %} <input type="text" name="searchword" class="form-control" required id="id_searchword"> <input type="submit" value="click"> </form>
このように設定しておけば、このサイトにアクセスがあった際、Djangoが{% csrf_token %}の部分をレンダリングして、CSRFトークンを埋め込んでくれます。
名前:スカーレット
2010年からWEBサイトやWEBアプリを作成しています。最初は趣味でブログを書いていましたがSEOを勉強するのが楽しくなり、そのままブロガーとして独立しました。その後、記事を書くだけでは物足りなくなり自分でWEBアプリの作成をスタート。現在はブロガー兼プログラマーとして活動しています。このWEBアプリ(ブロトーク)もDjangoで自作しました。ブロトークはブログとSNSを合体させたようなWEBアプリです。ブログを読んで気づいた事や感想などあれば、気軽にメッセージを送って頂ければと思います。WEB技術を一緒に勉強していけたらと思います。
コメントフォーム