<div class={{ user_input }}>
Django公式ドキュメントも、属性値を引用符で囲まない場合は、自動エスケープだけでは不正な属性追加を防げない例を示しています。
<script>
const username = "{{ user_input }}";
</script>
HTMLエスケープだけでは、安全を保証できません。
可能な限り、信頼できない値をJavaScriptコードへ直接埋め込まない設計にします。
Djangoでは、構造化データを渡す場合にjson_scriptなどの専用機能を検討します。
<a href="{{ user_url }}">リンク</a>
URLエンコードだけでは不十分です。
次の検証も必要です。
許可するスキーム
許可するホスト
相対URLか絶対URLか
リダイレクト先の制限
javascript:などの危険なスキーム
<style>
.profile {
background-image: url("{{ value }}");
}
</style>
CSSコンテキストも独自の解析規則を持ちます。
信頼できない文字列をCSSへ直接埋め込む設計は、可能な限り避けます。
