カテゴリ: Flask 更新日: 2026/01/11

FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう

FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう
FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう

先生と生徒の会話形式で理解しよう

生徒

「Flaskでフォームを作ったら、セキュリティ対策が必要って聞いたんですけど、本当ですか?」

先生

「はい、特にCSRFという攻撃から守るための対策がとても重要なんです。」

生徒

「CSRFって何ですか?難しそうで不安です…」

先生

「大丈夫ですよ!CSRFの意味や、FlaskでのCSRF対策の方法を、初心者向けにやさしく解説していきましょう!」

1. CSRF(クロスサイトリクエストフォージェリ)とは?

1. CSRF(クロスサイトリクエストフォージェリ)とは?
1. CSRF(クロスサイトリクエストフォージェリ)とは?

まず「CSRF(シーエスアールエフ)」とは、Cross-Site Request Forgeryという攻撃のことです。日本語では「クロスサイトリクエストフォージェリ」と言い、ユーザーの意図しない操作が勝手に実行されてしまう攻撃です。

たとえば、あなたが銀行のサイトにログイン中に、別の悪いページを開くと、勝手に送金が実行されてしまう…というようなことが起きてしまいます。

つまり、自分の操作じゃないのに、自分の権限で勝手に何かされてしまうという非常に危険なものです。

2. FlaskでCSRF対策をする理由

2. FlaskでCSRF対策をする理由
2. FlaskでCSRF対策をする理由

Flask(フラスク)はPythonでWebアプリケーションを作るための便利なツールですが、自動ではCSRF対策はされません

そのため、フォームを使ったログイン、登録、問い合わせなどを実装する場合、開発者が自分でCSRF対策を実装する必要があります。

そこで使うのが、Flask-WTF(フラスク・ダブリューティーエフ)という拡張機能です。

3. Flask-WTFとは?

3. Flask-WTFとは?
3. Flask-WTFとは?

Flask-WTFは、Flaskで安全なフォームを簡単に作るためのライブラリ(部品セット)です。

このライブラリを使うと、CSRFトークンという秘密の合言葉を自動でフォームに埋め込んでくれます。

その合言葉が正しければ「安全なフォーム送信」と判断される仕組みです。

4. Flask-WTFを使ってCSRF対策を実装する方法

4. Flask-WTFを使ってCSRF対策を実装する方法
4. Flask-WTFを使ってCSRF対策を実装する方法

それでは実際に、FlaskでCSRF対策付きのフォームを作ってみましょう。まずは、必要なライブラリをインストールします。


pip install flask-wtf

5. シンプルなフォームを作ってみよう

5. シンプルなフォームを作ってみよう
5. シンプルなフォームを作ってみよう

フォームに名前を入力するだけの簡単なWebアプリを作って、Flask-WTFによるCSRF対策の動作を見てみましょう。


from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.secret_key = "このキーは外部に絶対に漏らさない!"

class NameForm(FlaskForm):
    name = StringField("お名前", validators=[DataRequired()])
    submit = SubmitField("送信")

@app.route("/", methods=["GET", "POST"])
def index():
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        return f"こんにちは、{name}さん!"
    return render_template("form.html", form=form)

if __name__ == "__main__":
    app.run(debug=True)

6. HTMLテンプレートでフォームを表示する

6. HTMLテンプレートでフォームを表示する
6. HTMLテンプレートでフォームを表示する

Flaskでは、HTMLファイルにフォームを表示する必要があります。Flask-WTFでは、{{ form.csrf_token }}を自動で使うことでCSRF対策ができます。


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>お名前フォーム</title>
</head>
<body>
    <h1>名前を入力してください</h1>
    <form method="POST">
        {{ form.csrf_token }}
        {{ form.name.label }}<br>
        {{ form.name(size=30) }}<br><br>
        {{ form.submit() }}
    </form>
</body>
</html>

7. FlaskでのCSRFトークンの仕組みとは?

7. FlaskでのCSRFトークンの仕組みとは?
7. FlaskでのCSRFトークンの仕組みとは?

CSRFトークンとは、そのページだけに通用する秘密の番号のようなものです。

フォームを開いたときにFlaskがこのトークンを自動で作り、フォームにこっそり入れておきます。

ユーザーが送信したときに、このトークンが合っていれば「本人が正しく送った」と判断されるのです。

つまり、見た目は同じフォームでも、トークンがない=偽物というわけです。

8. トークンがないとどうなる?

8. トークンがないとどうなる?
8. トークンがないとどうなる?

もしフォームにCSRFトークンが含まれていない場合や、値が間違っている場合は、次のようなエラーになります。


400 Bad Request: The CSRF token is missing.

これはFlask-WTFが「これは安全なフォームではない」と判断して拒否した証拠です。セキュリティが働いているのです。

9. CSRF対策はなぜ必要なの?

9. CSRF対策はなぜ必要なの?
9. CSRF対策はなぜ必要なの?

パスワードやメールアドレスを入力するフォーム、送金や削除のような操作を行うフォームには、必ずCSRF対策を入れるべきです。

何もしないと、誰でも勝手に操作を実行できてしまうリスクがあります。Flask-WTFを使うだけで簡単に守れるので、初心者の方でもぜひ導入しましょう。

まとめ

まとめ
まとめ

FlaskでCSRF対策を実装することは、Webアプリケーションを安全に運用するための重要な基本になります。特にフォームを使った送信処理は、ユーザーが入力する情報がそのままアプリに反映されるため、攻撃者に悪用される可能性が高く、正しい保護が求められます。ここでは記事の内容を振り返りながら、CSRF対策の考え方、Flask-WTFを利用した実装手順、フォームの構造と仕組み、安全なCSRFトークンの役割などを整理し、より深い理解につながるようにくわしくまとめていきます。

CSRF対策の重要性を再確認しよう

CSRF攻撃は、ユーザーが意図していない操作を勝手に実行させる危険な攻撃です。見た目は通常のフォーム送信に見えても、攻撃者が用意した偽フォームや罠ページにアクセスするだけで、本人のアカウント権限で不正な操作が行われてしまいます。Flaskでは標準でCSRF対策が組み込まれているわけではなく、開発者自身が対策を追加する必要があります。そのため、Flask-WTFを利用してトークン生成を自動化し、毎回のフォーム送信を安全にする仕組みがとても役立ちます。

Flask-WTFを使ったフォームの安全な構築

Flask-WTFは、フォームの構築を簡単にしつつ、セキュリティ面でも頼れるライブラリです。特に{{ form.csrf_token }}をテンプレートに埋め込むだけで、自動的にCSRFトークンを生成し、送信時に検証される仕組みが整います。これにより、フォーム送信のたびに「本人が表示したページのフォーム」であることがチェックされ、不正なリクエストが判定されます。


from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class SafeForm(FlaskForm):
    nickname = StringField("ニックネーム", validators=[DataRequired()])
    submit = SubmitField("送信")

こうしたコード構造を理解しておくことで、複雑な入力フォームを扱う際にも安全性を保ちながら処理を進められます。また、Flaskアプリ全体の安全性を向上させるための基礎づくりにもつながります。

テンプレート側でのCSRFトークンの扱いを理解する

Flask-WTFによるテンプレートでのCSRFトークン挿入はとてもシンプルですが、その裏では重要なセキュリティ処理が行われています。トークンが正しいかどうかを判定することで、外部からの不正送信を防止します。テンプレートでは次のように書くだけで安全性が保たれます。


<form method="POST">
    {{ form.csrf_token }}
    {{ form.nickname.label }}<br>
    {{ form.nickname(size=30) }}
    {{ form.submit() }}
</form>

トークンがない場合に起こるエラーを知る

CSRFトークンがない、あるいは不正な値で送信された場合、Flask-WTFは適切にエラーを返し、危険なリクエストを遮断します。これは安全なアプリケーションを保つために重要な働きであり、エラーが出ることは正常な守りの動作です。

まとめ:Flaskで安全なフォーム送信を実現するために

Flaskで安全なアプリを作るためには、CSRF対策を含めたフォーム処理が欠かせません。Flask-WTFを使うことで、初心者でも簡単に実装が可能であり、ユーザーが安心して利用できるWebアプリへと近づけます。また、フォームごとに毎回異なるトークンが生成される仕組みを理解しておくと、より高度なフォーム機能や複数ページでの安全なデータ送信にも応用できます。 今回のような基本的なサンプルコードを参考にしながら、入力フォームを安全に扱う習慣を身につけることが、今後の開発スキルアップの大きな助けになります。実際に動かして試してみることでより理解が深まり、どんな場面でCSRFトークンが必要なのかが自然と見えてきます。

先生と生徒の振り返り会話

生徒

「今日のCSRF対策の内容、とても勉強になりました!特にトークンの仕組みがわかりやすかったです。」

先生

「よかったね。トークンは見えないけれど、とても大きな役割を持っているんだよ。フォームを守るための鍵のようなものなんだ。」

生徒

「Flask-WTFを使うだけで自動で対策できるのも驚きでした。これなら初心者でも安全なフォームが作れそうです!」

先生

「その通り。仕組みを理解しておくと、どんなアプリにも応用できるからね。これからフォームを使う処理を作るたびに、自然とセキュリティを意識できるようになるはずだよ。」

生徒

「次はもっと複雑なフォームや別のセキュリティ対策にも挑戦してみたいです!」

先生

「その気持ちが大事。一歩ずつ確実に積み重ねていけば、安心して使えるWebアプリを作れるようになるよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

FlaskでCSRFとは何のことですか?

FlaskでCSRFとは、「クロスサイトリクエストフォージェリ」と呼ばれるセキュリティ攻撃を指します。ユーザーの知らない間に、本人のアカウントで不正な操作を実行されてしまう危険性があるため、Flaskでフォームを使う場合はCSRF対策が非常に重要です。
カテゴリの一覧へ
新着記事
New1
Flask
FlaskでCSRF対策を実装する方法!安全なフォーム送信を学ぼう
New2
Python
Pythonの文字列型(str)を完全解説!連結・分割・検索の方法を紹介
New3
Python
Pythonで日付文字列から曜日を取得する方法を完全ガイド!初心者でもわかる日時処理入門
New4
Flask
FlaskアプリのSSL設定方法をやさしく解説!初心者でもわかるHTTPS対応の手順
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.4
Java&Spring記事人気No4
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.5
Java&Spring記事人気No5
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.8
Java&Spring記事人気No8
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説