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

Flaskでアカウントロックとログイン試行回数制限を導入する方法を完全解説!初心者でもわかるセキュリティ入門

Flaskでアカウントロックやログイン試行回数制限を導入する方法
Flaskでアカウントロックやログイン試行回数制限を導入する方法

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

生徒

「先生、Flaskでログイン画面を作ったんですが、不正ログインを防ぐ方法ってあるんですか?」

先生

「とても大事なポイントですね。Flaskでは、アカウントロックやログイン試行回数の制限を設定することで、不正アクセスを防ぐことができますよ。」

生徒

「アカウントロックって具体的にはどんな仕組みなんですか?」

先生

「アカウントロックとは、何度も間違ったパスワードを入力した場合に、そのアカウントを一時的に停止する仕組みです。これで総当たり攻撃(ブルートフォース攻撃)を防ぐことができます。」

生徒

「なるほど!Flaskでそれを実装するにはどうすればいいんですか?」

先生

「それでは、順番に詳しく説明していきましょう。」

1. Flaskでログイン試行回数制限をつける理由

1. Flaskでログイン試行回数制限をつける理由
1. Flaskでログイン試行回数制限をつける理由

Webアプリケーションでは、誰でもアクセスできるログイン画面が「不正ログイン攻撃」の標的になりやすいです。攻撃者は自動化したプログラムを使って、パスワードを何度も試す「総当たり攻撃」を仕掛けることがあります。

このとき、ログイン試行回数を制限しておけば、一定回数間違えるとアカウントをロックでき、攻撃を防止できます。これを「アカウントロック機能」と呼びます。

2. ログイン試行回数を記録する方法

2. ログイン試行回数を記録する方法
2. ログイン試行回数を記録する方法

ログイン試行回数を記録するには、ユーザーごとに「何回ログインに失敗したか」を保存しておく必要があります。簡単な方法としては、Pythonのdictionary(辞書)型やデータベースを使うやり方があります。

まずは初心者でも試しやすいように、簡単な辞書を使って説明してみましょう。


from flask import Flask, request, redirect, render_template_string

app = Flask(__name__)

# ユーザーごとのログイン試行回数を保存する辞書
login_attempts = {}

@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form.get('username')
    password = request.form.get('password')

    # 最大試行回数
    MAX_ATTEMPTS = 3

    if request.method == 'POST':
        # 試行回数の初期化
        if username not in login_attempts:
            login_attempts[username] = 0

        # アカウントロック判定
        if login_attempts[username] >= MAX_ATTEMPTS:
            return "アカウントがロックされています。しばらくしてからお試しください。"

        # 仮の正しいパスワード
        correct_password = "password123"

        if password == correct_password:
            login_attempts[username] = 0  # 成功時にリセット
            return "ログイン成功!"
        else:
            login_attempts[username] += 1
            return f"ログイン失敗。残り{MAX_ATTEMPTS - login_attempts[username]}回です。"

    return render_template_string('''
    <form method="post">
        ユーザー名:<input name="username"><br>
        パスワード:<input name="password" type="password"><br>
        <input type="submit" value="ログイン">
    </form>
    ''')

このコードでは、3回間違えるとログインできなくなります。簡単な例ですが、基本的な仕組みを理解するのに最適です。

3. アカウントロックを一定時間で解除する

3. アカウントロックを一定時間で解除する
3. アカウントロックを一定時間で解除する

「3回間違えたら一生ロック」では使い勝手が悪いですよね。そこで、時間が経ったら自動的に解除されるようにします。Pythonのdatetimeモジュールを使えば簡単に実装できます。


import datetime

# ユーザーの試行回数とロック時間を保存
login_data = {}

LOCK_TIME = datetime.timedelta(minutes=5)  # 5分ロック

@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form.get('username')
    password = request.form.get('password')

    if request.method == 'POST':
        user = login_data.get(username, {"attempts": 0, "lock_time": None})

        # ロック中か確認
        if user["lock_time"] and datetime.datetime.now() < user["lock_time"]:
            return "アカウントはロック中です。5分後に再度お試しください。"

        # 正しいパスワード
        correct_password = "password123"

        if password == correct_password:
            login_data[username] = {"attempts": 0, "lock_time": None}
            return "ログイン成功!"
        else:
            user["attempts"] += 1
            if user["attempts"] >= 3:
                user["lock_time"] = datetime.datetime.now() + LOCK_TIME
                return "3回失敗したため、アカウントが5分間ロックされました。"
            login_data[username] = user
            return f"ログイン失敗。残り{3 - user['attempts']}回です。"

    return render_template_string('''
    <form method="post">
        ユーザー名:<input name="username"><br>
        パスワード:<input name="password" type="password"><br>
        <input type="submit" value="ログイン">
    </form>
    ''')

このようにすると、間違いが続いたユーザーだけ一時的にロックされ、5分後に再びログインできるようになります。これが実用的な「アカウントロック機能」です。

4. セキュリティ強化のポイント

4. セキュリティ強化のポイント
4. セキュリティ強化のポイント

Flaskでのアカウントロックやログイン試行制限は基本ですが、より安全にするために次のような工夫が重要です。

  • IPアドレスごとの制限:同じIPからの連続ログインを制御。
  • ログイン履歴の記録:ログイン日時を記録して不審なアクセスを検出。
  • CAPTCHA(キャプチャ)導入:機械的な自動ログインを防ぐ。
  • データベース保存:辞書ではなく、SQLiteやMySQLに記録して永続化。

これらを組み合わせることで、Flaskアプリをより安全に保つことができます。

5. 初心者に伝えたいポイント

5. 初心者に伝えたいポイント
5. 初心者に伝えたいポイント

「ログイン試行回数を数える」「時間を管理する」「条件で動作を変える」──これらはすべてプログラミングの基本です。Flaskでアカウントロックを作ることは、Pythonの基礎とWebのセキュリティの両方を学べるとても良い練習になります。

もし初めてFlaskを触る場合でも、まずは上記のサンプルコードをコピーして動かしてみてください。仕組みが見えると一気に理解が深まりますよ。

カテゴリの一覧へ
新着記事
New1
Django
Djangoプロジェクトのディレクトリ構造を完全解説!初心者でも迷わないフォルダの見方
New2
Flask
Flask×Flask-SocketIOでチャットアプリを作る流れを初心者向けにやさしく解説
New3
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New4
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.5
Java&Spring記事人気No5
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.8
Java&Spring記事人気No8
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説