説明
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を使用すると、対象の拡張子を指定できます。