Flask を使ったセキュアな HTML レンダリング

PythonBeginner
オンラインで実践に進む

はじめに

HTML を返す場合(Flask の既定の応答タイプ)、出力にレンダリングされるユーザーによって提供された値は、注入攻撃から保護するためにエスケープする必要があります。この実験では、これを達成するために escape をどのように使用するかを学びます。また、後ほど紹介する Jinja でレンダリングされる HTML テンプレートも自動的にこれを行います。今のところ、手動でこれを行うには escape を使用するだけです。

エスケープ

このステップでは、注入攻撃からの保護を達成するために escape をどのように使用するかを学びます。

  1. html_escaping.py ファイルを開き、まず Flask クラスと escape をインポートします。
from flask import Flask
from markupsafe import escape
  1. 次に、Flask クラスのインスタンスを作成します。
app = Flask(__name__)
  1. その後、route() デコレータを使用して、escaping と呼ばれるビュー関数を持つ / ルートを作成します。関数内で JavaScript コードスニペットを定義し、escape を使用してそれをテキストとしてレンダリングし、HTML で特別な意味を持つ文字をエスケープします。
@app.route('/')
def escaping():
    input = "<script>alert('XSS attack');</script>"
    escaped_input = escape(input)
    return f"User input: {escaped_input}"
  1. スクリプトの main エントリポイントを作成して、Flask アプリケーションをポート 5000 で起動し、デバッグモードを有効にします。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. アプリケーションを実行するには、まず次のコマンドを使用してターミナルで Flask アプリケーションを起動します。
python3 html_escaping.py

次に、インターフェイスの上部にある「Web 5000」タブを開き、ページを更新すると、次のメッセージが表示されるはずです。 XSS 攻撃防止の例

  • <script> タグは、JavaScript として実行されることなく、テキストとして安全に表示され、XSS 攻撃の防止を示しています。

まとめ

この実験では、入力を手動でエスケープするために escape をどのように使用するかを学びました。これは、潜在的に有害な攻撃に対処する際に非常に役立つことができます。後ほど、自動的かつ効率的にこれを行うことができる Jinja を使用してテンプレートをレンダリングする方法を学びます。