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

Flaskの認証処理でよくあるセキュリティの落とし穴まとめ|初心者でも安心の安全設計ガイド

Flaskの認証処理でよくあるセキュリティの落とし穴まとめ
Flaskの認証処理でよくあるセキュリティの落とし穴まとめ

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

生徒

「Flaskでログイン画面を作ったんですが、セキュリティってどう考えたらいいんでしょうか?怖い攻撃とかあるんですか?」

先生

「Flaskで認証機能を作るときには、いくつかの落とし穴があって、そのまま作ると攻撃されてしまうこともあるんだよ。銀行の鍵を机の上に置きっぱなしにするようなものだね。」

生徒

「鍵が机の上!? それは危なすぎです…!具体的にはどんな落とし穴があるんですか?」

先生

「それじゃあ、Flaskの認証処理で初心者がつまずきやすい危険ポイントを順番に見ていこう。」

1. パスワードを平文のまま保存する危険性

1. パスワードを平文のまま保存する危険性
1. パスワードを平文のまま保存する危険性

Flaskでユーザー登録機能を作るときに、入力されたパスワードをそのまま保存してしまうケースは意外と多いです。これは「通帳と印鑑を同じ袋に入れて玄関に置いておく」ようなものです。データベースが盗まれた瞬間、すべてのユーザーのパスワードが筒抜けになってしまいます。

安全にするには、ハッシュ化(元に戻せない変換) を行います。Flaskでは werkzeug.security の関数で簡単に安全なハッシュ処理ができます。


from werkzeug.security import generate_password_hash, check_password_hash

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

ハッシュ化はまるで「鍵を溶かして固め直す」ようなもので、見た目は変わるけれど元の形には戻せません。

2. セッションを使い回す危険性

2. セッションを使い回す危険性
2. セッションを使い回す危険性

Flaskではユーザーがログイン中であることをセッションで管理します。セッションとは「ユーザーの荷物に貼る識別シール」のようなもので、この値が盗まれると他人のふりができてしまいます。セッションを安全に扱うためには、SECRET_KEY を必ず安全な値に設定する必要があります。


app = Flask(__name__)
app.config["SECRET_KEY"] = "ここに強力なランダム文字列"

SECRET_KEYを短い文字列にしたり、公開リポジトリに載せてしまうのは「家の鍵を玄関に刺したまま出かける」のと同じです。

3. CSRF対策を忘れる落とし穴

3. CSRF対策を忘れる落とし穴
3. CSRF対策を忘れる落とし穴

CSRF攻撃(クロスサイトリクエストフォージェリ)は、ユーザーが知らない間に悪意あるサイトで勝手に操作されてしまう攻撃です。例えるなら「あなたの名前を勝手に使って宅急便を注文される」ようなものです。

フォームを扱う場合は、CSRFトークンを必ず配置します。Flask-WTFを使うと簡単に対策できます。


from flask_wtf import FlaskForm
from wtforms import StringField

class LoginForm(FlaskForm):
    username = StringField("ユーザー名")

CSRFトークンは「荷物の受け取り確認印」のようなもので、本人以外が勝手に押せない仕組みです。

4. クリックジャッキング対策をしない危険性

4. クリックジャッキング対策をしない危険性
4. クリックジャッキング対策をしない危険性

クリックジャッキングは、透明なボタンを重ねてユーザーをだます攻撃です。家の表札に透明なシールを貼られて勝手に別の名前に書き換えるようなものです。

ヘッダーに X-Frame-Options を設定すれば防げます。


from flask import Flask, make_response

@app.after_request
def add_header(response):
    response.headers["X-Frame-Options"] = "DENY"
    return response

この設定により、悪意あるサイトがあなたのサイトを「透明な画面の裏」に隠して操作させることを防ぎます。

5. エラーメッセージに機密情報を表示する失敗

5. エラーメッセージに機密情報を表示する失敗
5. エラーメッセージに機密情報を表示する失敗

初心者がやりがちな罠として、認証エラーが発生したときに詳しすぎる説明を表示してしまうことがあります。「そのユーザー名は存在しません」「パスワードが違います」のような表示は、攻撃者に手がかりを与えてしまいます。

安全なサービスでは、「認証に失敗しました」 のように情報を最小限に抑えます。これは「金庫の場所を教えても鍵の構造は教えない」という考え方です。

6. HTTPS を使わない危険性

6. HTTPS を使わない危険性
6. HTTPS を使わない危険性

HTTPのままログイン機能を作ると、通信内容がそのまま見えてしまいます。これは「透明な封筒でラブレターを送る」ぐらい危険です。パスワードやセッションが盗まれる理由の多くは、HTTPSを使わないところにあります。

Flask本体ではなくサーバーやリバースプロキシ側でHTTPSを設定します。インターネットに公開するなら必須の設定です。

7. 認証状態のチェックを忘れるミス

7. 認証状態のチェックを忘れるミス
7. 認証状態のチェックを忘れるミス

「ログインしないと見れないページ」を作るとき、毎回セッションをチェックしなければなりません。これを忘れると、誰でも情報を覗ける「鍵の閉め忘れ」のような状態になります。保護したいルートには必ずログイン必須の仕組みを付けます。


from functools import wraps
from flask import session, redirect, url_for

def login_required(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        if "user" not in session:
            return redirect(url_for("login"))
        return f(*args, **kwargs)
    return wrapper

これにより、鍵を締め忘れて家に誰でも入れるような事態を防げます。

カテゴリの一覧へ
新着記事
New1
Flask
認証と認可の違いを整理しよう!Flaskで押さえるべき基礎概念
New2
Flask
Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説!初心者でもわかるステップ解説
New3
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
New4
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
No.2
Java&Spring記事人気No2
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説
No.3
Java&Spring記事人気No3
Python
Pythonでリストの要素を検索・取得する方法!index()やin演算子の活用法
No.4
Java&Spring記事人気No4
Python
Pythonのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.5
Java&Spring記事人気No5
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.6
Java&Spring記事人気No6
Python
Pythonプログラムの書き方を基礎から学ぼう!初心者が覚えるべき文法とは?
No.7
Java&Spring記事人気No7
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.8
Java&Spring記事人気No8
Flask
Flaskでクラウド上のメッセージキュー(SQS/PubSub)を扱う完全ガイド!初心者向け解説