カテゴリ: Flask 更新日: 2025/12/08

Flaskアプリのセキュリティ対策まとめ!初心者向けに基本をやさしく解説

Flaskアプリのセキュリティ対策まとめ!初心者向けに基本をやさしく解説
Flaskアプリのセキュリティ対策まとめ!初心者向けに基本をやさしく解説

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

生徒

「FlaskっていうPythonのWebアプリを作るときに、セキュリティって必要なんですか?」

先生

「はい、とても大切です!Webアプリはインターネットを通して使われるので、悪意のある人に悪用されないように、ちゃんと守る必要があるんですよ。」

生徒

「どんなふうに守ればいいんですか?全然わからなくて…」

先生

「大丈夫!これから初心者でも分かるように、Flaskアプリのセキュリティ対策をひとつずつ、わかりやすく説明していきますね!」

1. セキュリティ対策って何のため?

1. セキュリティ対策って何のため?
1. セキュリティ対策って何のため?

まず最初に、セキュリティ対策とは「悪い人から自分のWebアプリやデータを守ること」です。

Flask(フラスク)はPythonで作るWebアプリの仕組み(フレームワーク)です。インターネットにつながるので、誰でもアクセスできます。それが便利な反面、悪意のある攻撃者もアクセスできてしまいます。

たとえば、パスワードを盗まれるデータを壊される変な画面を表示されるなどの被害があります。

だからこそ、セキュリティ対策がとても大事なんです。

2. Flaskアプリのセキュリティ対策の基本

2. Flaskアプリのセキュリティ対策の基本
2. Flaskアプリのセキュリティ対策の基本

では、初心者でもできる基本的なFlaskのセキュリティ対策を紹介していきます。専門用語もやさしく説明するので安心してください。

3. 秘密鍵(Secret Key)を設定しよう

3. 秘密鍵(Secret Key)を設定しよう
3. 秘密鍵(Secret Key)を設定しよう

Flaskでは、「セッション」というしくみを使って、ログイン中のユーザー情報などを覚えておくことができます。そのために使うのがSecret Key(シークレットキー)です。

この鍵が他人に知られると、他人が勝手にログイン状態になったりできてしまう危険があります。

だから、必ず長くて複雑な秘密鍵を設定しましょう。


from flask import Flask

app = Flask(__name__)
app.secret_key = "この部分は絶対に他人に知られないようにしよう!例:Jf8s!k3zL0x@9#"

4. フォームのCSRF対策とは?

4. フォームのCSRF対策とは?
4. フォームのCSRF対策とは?

CSRF(シーエスアールエフ)とは「クロスサイトリクエストフォージェリ」といって、知らないうちに勝手に操作される攻撃です。

たとえば、ログインしたままの状態で、悪いページを開いたら、勝手に商品を買わされていた!ということも。

これを防ぐには、CSRFトークンという秘密の合言葉を使う必要があります。

Flaskでは、「Flask-WTF(フラスク・ダブリューティーエフ)」というライブラリを使うことで簡単にCSRF対策ができます。


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

class MyForm(FlaskForm):
    name = StringField('名前', validators=[DataRequired()])
    submit = SubmitField('送信')

5. 入力内容をしっかりチェックしよう(バリデーション)

5. 入力内容をしっかりチェックしよう(バリデーション)
5. 入力内容をしっかりチェックしよう(バリデーション)

ユーザーからの入力には、危険なコードが含まれていることがあります。

たとえば、フォームに「名前」を入力するところに、プログラムを壊すような変な文字が入っていたら危ないですよね。

これを防ぐために、「バリデーション(検証)」を使って、入力がちゃんとしているかチェックしましょう。

さきほどのFlask-WTFを使えば簡単です。


name = StringField('名前', validators=[DataRequired()])

DataRequired()は、「空欄じゃダメですよ」という意味です。

6. テンプレートに危険なコードを表示させないようにする

6. テンプレートに危険なコードを表示させないようにする
6. テンプレートに危険なコードを表示させないようにする

Flaskでは、テンプレート(HTMLファイル)にデータを表示します。そのとき、ユーザーが入力したデータをそのまま表示してしまうと、XSS(クロスサイトスクリプティング)という攻撃を受ける可能性があります。

Flaskでは自動で危険な文字を無効にしてくれる(エスケープしてくれる)ので、基本的には安心ですが、|safeを使うとその機能をオフにしてしまうので注意です。

次のように書くと、Flaskが自動で守ってくれます。


<p>{{ user_input }}</p>

{{ user_input|safe }} のように|safeをつけてしまうと、危ないコードも実行されることがあります。

7. デバッグモードは本番環境で絶対使わない

7. デバッグモードは本番環境で絶対使わない
7. デバッグモードは本番環境で絶対使わない

デバッグモードとは、プログラムのエラーを調べやすくするためのモードです。

とても便利ですが、本番環境(公開している状態)で使ってしまうと、中のプログラムやファイルの情報が見えてしまう可能性があります。

これは攻撃者にとってヒントを与えてしまう行為なので、絶対に避けましょう。


# 開発中だけ使う
app.run(debug=True)

# 本番環境では
app.run(debug=False)

8. パスワードはハッシュ化して保存しよう

8. パスワードはハッシュ化して保存しよう
8. パスワードはハッシュ化して保存しよう

「ハッシュ化」とは、パスワードをそのまま保存せずに、変換して別の文字列にすることです。

たとえば「apple」というパスワードは、変換すると「1f3870be274f6c49b3e31a0c6728957f」などになります。

こうすることで、もし誰かにデータベースが盗まれても、すぐにパスワードが分からないようになります。


from werkzeug.security import generate_password_hash, check_password_hash

hashed_pw = generate_password_hash('apple')
print(hashed_pw)  # 保存するのはこちら

# ログインのときにはこうやって確認する
check_password_hash(hashed_pw, 'apple')  # Trueが返る

9. HTTPとHTTPSの違いを知っておこう

9. HTTPとHTTPSの違いを知っておこう
9. HTTPとHTTPSの違いを知っておこう

URLの最初が「http://」か「https://」か、見たことありますか?

HTTPSは、安全な通信方法で、通信内容が暗号化されます。つまり、誰にも見られずにサーバーとやりとりできます。

ログインや登録のときにHTTPのままだと、パスワードなどが見られてしまう可能性があるので、必ずHTTPSを使いましょう。

まとめ

まとめ
まとめ

Flaskアプリの安全性を高めるためには、ひとつひとつの基本をしっかり理解しながら実践することが大切です。とくに、秘密鍵の設定、CSRF対策、バリデーション、テンプレートのエスケープ処理、デバッグモードの扱い、そしてパスワードのハッシュ化などは、初心者でも取り組みやすい重要な手順です。これらのポイントを確実に押さえることで、Flaskアプリはより信頼できる安全な仕組みに近づきます。また、https通信を意識することで、情報のやり取りがより強固に守られます。こうした基本的な対策を徹底することが、今後の開発スキルを高めるための大切な土台になります。ここでは、学んだ内容を整理しながら、実際の動きをイメージできるように、サンプルコードを使いながらより深く理解していきます。

安全な秘密鍵の設定を再確認しよう

Flaskのセッション管理に欠かせない秘密鍵は、推測されにくい長く複雑な文字列にする必要があります。単純な文字列のままだと悪意のある攻撃者に不正アクセスされやすくなり、ユーザー情報が危険にさらされます。安全性を高めるためにも、下記のような複雑な鍵を環境変数などを使って管理する方法が推奨されます。


from flask import Flask
import os

app = Flask(__name__)
app.secret_key = os.environ.get("SECRET_KEY", "サンプルの秘密鍵を安全に管理しよう")

フォームのCSRF対策を確実に行う

WebフォームにおけるCSRF対策は、ユーザーが意図しない操作を防ぐための大切な仕組みです。Flask-WTFを利用するだけでCSRFトークンが自動生成され、より安全なフォームが構築できます。入力内容が正しく送信されたかどうかの検証も行われるため、初心者でも安心して使える便利なライブラリです。


class EntryForm(FlaskForm):
    title = StringField('タイトル', validators=[DataRequired()])
    submit = SubmitField('送信')

入力データを守るためのバリデーション

Flaskアプリを安全に運用するためには、ユーザーが入力した値が正しい形式であるかを必ず確認する必要があります。もしも危険なコードが送信されてしまうと、アプリ全体が不正な動作を起こす可能性もあります。バリデーションを設定することで、未入力の値や不正な値を確実に排除し、より安全なアプリを維持できます。

テンプレートのエスケープとXSS対策

XSS攻撃は、ユーザーが入力した内容に悪意のあるスクリプトを混ぜてサイトに表示させる手法です。Flaskでは自動エスケープが働くため基本的には防げますが、|safeを使うとその保護が無効になります。そのため、表示するデータの内容をよく理解し、安全な範囲でのみ使用することが大切です。


<p class="user-text">{{ safe_text }}</p>

本番環境ではデバッグモードを使わない

デバッグモードは開発時に便利ですが、本番環境で動かすと内部のエラーメッセージやファイル構成が丸見えになる危険があります。外部からの攻撃のヒントを与えてしまう可能性があるため、本番環境では必ずFalseに設定する習慣をつけましょう。


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

パスワードは必ずハッシュ化して管理する

パスワードを平文で保存するのはとても危険です。ハッシュ化を行うことで、万が一データが漏えいした場合でもパスワードそのものが知られることを防げます。FlaskではWerkzeugの機能を使うと簡単にハッシュ化でき、ログイン時の照合も安全に行えます。


hashed = generate_password_hash("sample")
check_password_hash(hashed, "sample")

通信を守るHTTPSの重要性

HTTPSは通信内容を暗号化し、外部に見られないように守る役目があります。とくにログインや登録などの個人情報が関わるページでは必ず使用し、安全な通信を保つことが求められます。HTTPSを利用することで、ユーザーが安心して利用できる環境を提供できます。

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

生徒

「今日のFlaskのセキュリティ対策、すごく勉強になりました!特に秘密鍵やCSRF対策の重要性がよくわかりました。」

先生

「それはよかったね。セキュリティは『わかっているつもり』になりやすいけど、基本を徹底して守ることでアプリの安全性は大きく変わるんだよ。」

生徒

「パスワードをハッシュ化して保存する理由もよく理解できました。平文のまま保存するのは危険なんですね。」

先生

「その通り。ハッシュ化、バリデーション、エスケープ、HTTPS…どれもWebアプリを守るための大切な仕組みなんだ。ひとつずつ確実に覚えていけば、もっと安全なアプリが作れるよ。」

生徒

「もっと深く勉強して、セキュリティを意識したアプリ開発ができるようになりたいです!」

先生

「その意欲があれば大丈夫。少しずつレベルアップしていこうね。」

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

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

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

Flaskのセキュリティ対策ってなぜ必要なんですか?

FlaskはPythonでWebアプリを作るためのフレームワークですが、インターネット上で使われるため、悪意ある攻撃者からの攻撃を受けるリスクがあります。パスワードの漏洩、データの改ざん、不正アクセスなどを防ぐために、Flaskアプリには基本的なセキュリティ対策が必要です。
カテゴリの一覧へ
新着記事
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でリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.6
Java&Spring記事人気No6
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.7
Java&Spring記事人気No7
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.8
Java&Spring記事人気No8
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策