×
サイバー攻撃について
<div class={{ user_input }}>

Django公式ドキュメントも、属性値を引用符で囲まない場合は、自動エスケープだけでは不正な属性追加を防げない例を示しています。


JavaScriptコンテキスト

<script>
const username = "{{ user_input }}";
</script>

HTMLエスケープだけでは、安全を保証できません。

可能な限り、信頼できない値をJavaScriptコードへ直接埋め込まない設計にします。

Djangoでは、構造化データを渡す場合にjson_scriptなどの専用機能を検討します。


URLコンテキスト

<a href="{{ user_url }}">リンク</a>

URLエンコードだけでは不十分です。

次の検証も必要です。

  • 許可するスキーム

  • 許可するホスト

  • 相対URLか絶対URLか

  • リダイレクト先の制限

  • javascript:などの危険なスキーム


CSSコンテキスト

<style>
.profile {
    background-image: url("{{ value }}");
}
</style>

CSSコンテキストも独自の解析規則を持ちます。

信頼できない文字列をCSSへ直接埋め込む設計は、可能な限り避けます。


発火条件による派生分類

Blind XSS