はじめに
HTML を返す場合(Flask の既定の応答タイプ)、出力にレンダリングされるユーザーによって提供された値は、注入攻撃から保護するためにエスケープする必要があります。この実験では、これを達成するために escape をどのように使用するかを学びます。また、後ほど紹介する Jinja でレンダリングされる HTML テンプレートも自動的にこれを行います。今のところ、手動でこれを行うには escape を使用するだけです。
エスケープ
このステップでは、注入攻撃からの保護を達成するために escape をどのように使用するかを学びます。
html_escaping.pyファイルを開き、まずFlaskクラスとescapeをインポートします。
from flask import Flask
from markupsafe import escape
- 次に、
Flaskクラスのインスタンスを作成します。
app = Flask(__name__)
- その後、
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}"
- スクリプトの
mainエントリポイントを作成して、Flask アプリケーションをポート 5000 で起動し、デバッグモードを有効にします。
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
- アプリケーションを実行するには、まず次のコマンドを使用してターミナルで Flask アプリケーションを起動します。
python3 html_escaping.py
次に、インターフェイスの上部にある「Web 5000」タブを開き、ページを更新すると、次のメッセージが表示されるはずです。

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



