通常の文字列
└─ innerHTMLへ代入
└─ 拒否
アプリケーションが定義したポリシー
↓
サニタイズ
↓
TrustedHTML
└─ innerHTMLへ代入
└─ 許可
Trusted Typesはサニタイザーではありません。
危険なSinkへ渡す値を、アプリケーションが定義したポリシー経由に限定する仕組みです。W3C仕様でも、攻撃者が制御する入力を強力なWeb APIへ渡すことで生じる脆弱性を減らす目的が説明されています。
推奨構成です。
アプリケーション
https://example.com
アップロードファイル
https://usercontent-example.com
次の構成だけでは十分でない場合があります。
https://uploads.example.com
Cookieやドメイン設定によっては、サブドメイン間の影響が残るためです。
Django公式ドキュメントも、利用者アップロードを異なるトップレベルまたはセカンドレベルドメインから配信する方法を推奨しています。
次の設定はXSSそのものを防ぎません。
HttpOnly
Secure
SameSite
ただし、被害を抑える補助対策になります。