説明
テンプレートがユーザー入力を適切にエスケープせずに出力したり、エスケープ済みのデータを再び HTML として解釈したりすると、クロスサイトスクリプティングが発生するおそれがあります。
想定される影響
- 攻撃者がブラウザーで JavaScript を実行できる可能性があります。
- セッションの窃取、フィッシング、ユーザーになりすました操作、機密情報の漏えいにつながるおそれがあります。
対処方法
- テンプレートエンジンの既定の自動エスケープを維持してください。
- ユーザー入力を
innerHTMLや unsafe/raw 出力ブロックへ直接渡さないでください。 - HTML が必要な場合は、信頼できるサニタイザーで処理した限定的なマークアップだけを許可してください。
例
以下は Handlebars で通常の文字列を出力する例です。他のテンプレートエンジンでは、そのエンジンのエスケープ規則を確認してください。
変更前
html
<div>{{{ userContent }}}</div>
変更後
html
<div>{{ userContent }}</div>
説明:
- 変更前: 自動エスケープを無効にしたり、
safeフィルターなどで値を信頼済みとして出力したりすると、ユーザー指定の HTML やスクリプトが実行されるおそれがあります。 - 変更後:
{{ userContent }}で通常の文字列を HTML テキストとしてエスケープします。同じ方法が JavaScript や URL など、あらゆる出力先の文脈に適しているわけではありません。