デバッグモードとテストモードの有効化

Python Webアプリケーションの本番環境で有効なデバッグモードやテストモード

説明

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を指定し、関連機能を無効にします。

参考資料