テンプレートのエスケープ回避による XSS

テンプレートの XSS 保護の回避

説明

テンプレートがユーザー入力を適切にエスケープせずに出力したり、エスケープ済みのデータを再び HTML として解釈したりすると、クロスサイトスクリプティングが発生するおそれがあります。

想定される影響

  • 攻撃者がブラウザーで JavaScript を実行できる可能性があります。
  • セッションの窃取、フィッシング、ユーザーになりすました操作、機密情報の漏えいにつながるおそれがあります。

対処方法

  • テンプレートエンジンの既定の自動エスケープを維持してください。
  • ユーザー入力を innerHTML や unsafe/raw 出力ブロックへ直接渡さないでください。
  • HTML が必要な場合は、信頼できるサニタイザーで処理した限定的なマークアップだけを許可してください。

例

以下は Handlebars で通常の文字列を出力する例です。他のテンプレートエンジンでは、そのエンジンのエスケープ規則を確認してください。

変更前

html
<div>{{{ userContent }}}</div>

変更後

html
<div>{{ userContent }}</div>

説明:

  • 変更前: 自動エスケープを無効にしたり、safe フィルターなどで値を信頼済みとして出力したりすると、ユーザー指定の HTML やスクリプトが実行されるおそれがあります。
  • 変更後: {{ userContent }} で通常の文字列を HTML テキストとしてエスケープします。同じ方法が JavaScript や URL など、あらゆる出力先の文脈に適しているわけではありません。

参考資料