Jinjaの自動エスケープが無効

Jinjaの自動エスケープが無効

説明

Jinjaの自動エスケープが無効になっていると、HTMLに出力するユーザー入力が適切にエンコードされず、クロスサイトスクリプティング(XSS)が発生するおそれがあります。信頼できない値をHTMLに出力するときは、自動エスケープを有効にしてください。

想定される影響

  • XSS: 挿入されたスクリプトが他のユーザーのブラウザーで実行され、アカウントの乗っ取りにつながる可能性があります。
  • フィッシング: 悪意のあるリンクや偽のログインフォームがユーザーに表示されるおそれがあります。
  • 情報の窃取: ユーザーの機密情報を取得される可能性があります。

対処方法

  • Jinja環境のautoescapeオプションを有効にしてください。
  • HTMLエスケープは、URLスキームの検証やJavaScriptの文脈に応じた保護の代わりにはなりません。信頼できるテンプレートソースを使用し、ユーザー入力にsafeを適用して保護を解除しないでください。

例

変更前

python
# 自動エスケープを無効にしたJinja2コード
from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('template.html')
html_content = template.render(user_input=user_input)

変更後

python
# 自動エスケープを有効にしたJinja2コード
from jinja2 import Environment, FileSystemLoader, select_autoescape

env = Environment(
    loader=FileSystemLoader('templates'),
    autoescape=True
    # または`autoescape=select_autoescape(['html', 'xml'])`で対象の拡張子を指定
)
template = env.get_template('template.html')
html_content = template.render(user_input=user_input)

説明:

  • 変更前: 自動エスケープなしでユーザー入力をHTMLに出力するため、挿入されたマークアップやスクリプトがブラウザーで解釈されるおそれがあります。
  • 変更後: autoescapeがHTMLに出力する値をエスケープします。
    • select_autoescapeを使用すると、対象の拡張子を指定できます。

参考資料