XSS 学習ノート

PayloadsAllTheThings、OWASP、MDN を参考に、XSS の攻撃面と防御チェックを実務向けに整理しました。

テスト方法

  1. まず出力コンテキストを確認します: HTML text、attribute、URL、JavaScript string、CSS、DOM sink、iframe wrapper。
  2. コンテキスト別 payload を貼り付け、実行有無とブロックした policy を記録します。
  3. 管理者画面、通知、メール、ログ、preview など遅れて描画される surface も確認します。

見落としやすい攻撃面

HTML / attribute

script tag だけでなく event handler、SVG onload、quote breakout も確認します。

URL / protocol

href/src/action/data は正規化後に protocol allowlist で検証します。

DOM sink

location、hash、postMessage が innerHTML 等へ入ると DOM XSS になります。

Rich text / Markdown

保存形式ではなく最終 HTML を sanitize します。

iframe embed

host/protocol allowlist、sandbox、allow、referrer policy を一緒に設計します。

Files / Blind XSS

SVG/HTML upload と管理者 review は delayed stored XSS の典型です。

防御チェックリスト

議論したい実際の悩み

Community editor と iframe embed

ProseMirror の保存内容を別 renderer で表示し DOMPurify を適用しましたが、多様な embed provider を host allowlist で管理し続ける運用が現実的かが課題です。

Nickname と icon rendering

profile field は小さく見えますが、attribute や custom renderer を通ると stored XSS が広がります。