説明
Django、Flask、FastAPIなどのデバッグモードは、開発中に詳しいエラー情報を確認するための機能です。本番環境で有効にすると、スタックトレース、ソースコードの一部、ローカル変数、設定値などがレスポンスに含まれる可能性があります。
FlaskのTESTINGはデバッグモードとは別の設定です。拡張機能のテスト用動作を有効にし、PROPAGATE_EXCEPTIONSを別途設定していなければ、例外の伝播も暗黙的に有効にします。TESTING=True自体が対話型デバッガーを起動するわけではありませんが、本番環境のエラー処理を変え、テスト用の動作が実際のリクエストに影響する可能性があります。
想定される影響
- 内部情報の漏えい: Djangoの詳細なエラーページやFastAPIのデバッグ用トレースバックから、ソース位置、設定、リクエスト処理の構造が明らかになる可能性があります。
- リモートコード実行: 外部に公開されたFlask/Werkzeugの対話型デバッガーでは、ブラウザーからPythonコードを実行できます。PINをセキュリティ対策として信頼しないでください。
- エラー処理や拡張機能の動作の変化: Flaskのテストモードでは、例外がアプリケーションのエラーハンドラーに渡らず伝播したり、拡張機能がテスト専用の動作を有効にしたりすることがあります。
対処方法
- 本番環境では、Djangoの
DEBUG、FlaskのDEBUGとTESTING、FastAPIのdebugをブール値のFalseにしてください。 - 開発、テスト、本番の設定を分離し、デプロイ前に実際に適用される設定を自動検証してください。
- 本番環境では開発サーバーや対話型デバッガーを使わず、本番用サーバー、一般化したエラーレスポンス、サーバー側のログと通知を構成してください。
- 環境変数の文字列をブール値の引数に直接渡さないでください。
os.getenv("DEBUG", "False")は文字列を返し、空でない"False"もPythonでは真と評価されます。型を扱う設定層でブール値に変換してから使用してください。
開発やテストに必要な設定は本番設定から分離し、デプロイ時の最終的な値を確認してください。
例
Django
変更前
python
# settings/production.py
DEBUG = True
変更後
python
# settings/production.py
DEBUG = False
Flaskのデバッグモード
変更前
python
from flask import Flask
app = Flask(__name__)
app.run(debug=True)
変更後
python
from flask import Flask
app = Flask(__name__)
app.config["DEBUG"] = False
# 本番環境ではFlask開発サーバーではなく、本番用のWSGIサーバーで実行します。
Flaskのテストモード
変更前
python
from flask import Flask
app = Flask(__name__)
app.config.update(TESTING=True)
# app.testing = Trueも同じ設定を有効にします。
変更後
python
from flask import Flask
app = Flask(__name__)
app.config.update(TESTING=False)
FastAPI
変更前
python
from fastapi import FastAPI
app = FastAPI(debug=True)
変更後
python
from fastapi import FastAPI
app = FastAPI(debug=False)
説明:
- 変更前: 本番環境で詳細なエラーやテスト専用の動作を有効にします。
- 変更後: 本番設定に実際のブール値
Falseを指定し、関連機能を無効にします。
参考資料
- Flask 3.1.x: 設定の扱い —
TESTING - Flask 3.1.x: アプリケーションエラーのデバッグ
- Django 5.2 LTS: デプロイチェックリスト —
DEBUG - FastAPI:
FastAPIクラス —debug - OWASP: A02:2025 セキュリティ設定ミス
- OWASP: A05:2021 セキュリティ設定ミス
- CWE: CWE-489: 有効なデバッグコード