🎯 この章で学ぶこと

  • if / elif / else による条件分岐
  • インデント(字下げ)というPythonの最重要ルール
  • forwhile による繰り返し
  • break / continue によるループ制御

3.1 if文 — 条件で処理を分ける

ログイン失敗回数に応じて対応を変える、という実務っぽい例で見てみましょう。

# login_check.py
failed_attempts = 6

if failed_attempts >= 10:
    print("アカウントをロックします")
elif failed_attempts >= 5:
    print("警告: 失敗が多すぎます。管理者に通知します")
else:
    print("正常範囲内です")
$ python login_check.py
警告: 失敗が多すぎます。管理者に通知します

ポイントは3つです。

⚠️ インデントは「飾り」ではなく「文法」

多くの言語では字下げは見た目の問題ですが、Pythonではインデントそのものがブロック構造を決めます。ズレるとエラー(IndentationError)になるか、もっと悪いことに「エラーにならず意図と違う動きをする」ことがあります。歴史的に有名なAppleの「goto fail」脆弱性(2014年)は、ブロック構造の見落としが原因でTLS証明書検証がスキップされるというものでした。ブロックがどこからどこまでかを常に意識する習慣は、そのままセキュアコーディングの習慣です。

条件の組み合わせ — and・or・not

hour = 23
is_admin = False

# 深夜のアクセス、かつ管理者でない → 要注意
if hour >= 22 and not is_admin:
    print("深夜の一般ユーザーアクセスを記録します")

# どちらか一方でも成立すればTrue
if hour < 6 or hour >= 22:
    print("業務時間外のアクセスです")

3.2 for文 — 決まった回数・要素の数だけ繰り返す

for は「リストなどの要素を1つずつ取り出しながら繰り返す」構文です。

servers = ["web-01", "web-02", "db-01"]

for server in servers:
    print(f"{server} の死活監視を実行します")
web-01 の死活監視を実行します
web-02 の死活監視を実行します
db-01 の死活監視を実行します

回数を決めて繰り返したいときは range() を使います。

for i in range(3):        # 0, 1, 2 と変化する
    print(f"{i + 1} 回目の試行")
1 回目の試行
2 回目の試行
3 回目の試行
💡 range()は0から始まる

range(3) は 0, 1, 2 を生成します(3は含まない)。「0から数え始める」のはプログラミング全般の共通ルールです。range(1, 4) と書けば 1, 2, 3 になります。

3.3 while文 — 条件が成立している間、繰り返す

「何回繰り返すか事前にわからない」ときは while を使います。

# password_prompt.py — 3回まで再入力を許すパスワード確認(教材用)
CORRECT = "sakura-mochi-2026"
attempts = 0

while attempts < 3:
    entered = input("合言葉を入力: ")
    if entered == CORRECT:
        print("認証成功")
        break                # ループを途中で抜ける
    attempts = attempts + 1
    print(f"違います(残り {3 - attempts} 回)")
else:
    # breakされずにループが終わった時だけ実行される
    print("試行回数を超えました。ロックします")

ここで登場した2つのキーワードを整理します。

⚠️ 無限ループに注意

while True: のように常に成立する条件を書き、break を忘れるとプログラムは永遠に止まりません(Ctrl+C で強制終了できます)。意図しない無限ループはCPUを使い果たし、サービス停止(可用性の喪失=セキュリティ3要素の1つの侵害)につながります。

3.4 実践 — ログの中から失敗だけを数える

この章の内容を組み合わせると、もう「ログ解析の原型」が書けます。

# count_failed.py
logs = [
    "09:00:01 LOGIN OK user=tanaka",
    "09:00:15 LOGIN FAILED user=admin",
    "09:00:18 LOGIN FAILED user=admin",
    "09:01:02 LOGIN OK user=suzuki",
    "09:01:30 LOGIN FAILED user=root",
]

failed_count = 0
for line in logs:
    if "FAILED" in line:
        failed_count = failed_count + 1
        print(f"[警告] {line}")

print(f"ログイン失敗は合計 {failed_count} 件でした")
[警告] 09:00:15 LOGIN FAILED user=admin
[警告] 09:00:18 LOGIN FAILED user=admin
[警告] 09:01:30 LOGIN FAILED user=root
ログイン失敗は合計 3 件でした
🛡️ セキュリティの視点 — ブルートフォース攻撃と回数制限

3.3のプログラムで書いた「3回失敗したらロック」は、実際の認証システムに必ず入っているブルートフォース攻撃(総当たり攻撃)対策そのものです。攻撃者はプログラムでパスワードを機械的に試し続けます。回数制限・ロックアウト・待ち時間の挿入といった対策は、すべて今日学んだ「カウンタ変数 + if + ループ」でできています。基礎文法がそのまま防御技術になる好例です。

まとめ

練習問題

問題 3-1

変数 port に数値を入れ、「80か443なら『Web用ポート』、22なら『SSH用ポート』、それ以外なら『その他のポート』」と表示するプログラムを書いてください。

解答を見る
port = 443

if port == 80 or port == 443:
    print("Web用ポート")
elif port == 22:
    print("SSH用ポート")
else:
    print("その他のポート")
問題 3-2

forrange() を使って、1から100までの合計を計算して表示してください。

解答を見る
total = 0
for i in range(1, 101):   # 1〜100(101は含まない)
    total = total + i
print(total)              # 5050
問題 3-3

3.4のログ解析プログラムを改造して、「user=admin の失敗だけ」を数えるようにしてください。管理者アカウントへの攻撃は特に重要な監視対象です。

解答を見る
admin_failed = 0
for line in logs:
    if "FAILED" in line and "user=admin" in line:
        admin_failed = admin_failed + 1

print(f"adminへのログイン失敗: {admin_failed} 件")   # 2 件

条件を and でつなぐだけで「絞り込み」ができます。実際のSIEM(ログ監視システム)がやっていることの原理はこれと同じです。