XSSを「3種類の暗記」で終わらせず、Source、Sink、コンテキスト、実行場所、保存性を組み合わせて分析することが重要です。
最初は次の3つを覚えます。
Reflected XSS
Stored XSS
DOM-based XSS
その後、Server/Clientの分類を重ねると理解しやすくなります。
必ずしも残りません。
location.hashは通常、HTTPリクエストとしてサーバーへ送信されません。
そのため、URLフラグメントだけで成立するDOM XSSは、サーバーやWAFから見えない場合があります。
起こる可能性があります。
Djangoテンプレートは多くの入力を自動エスケープしますが、次の構成には注意が必要です。
safe
mark_safe
autoescape off
引用符のない属性
JavaScriptへ直接埋め込む
innerHTML
Markdown
利用者アップロード
WebSocket
管理画面でのログ表示
Django公式ドキュメントも、自動保護には限界があると説明しています。
通常の文字列描画はエスケープされます。
ただし、次の処理では注意が必要です。
dangerouslySetInnerHTML
外部URL
古い依存ライブラリ
DOM APIの直接利用
MarkdownやHTMLレンダラー
Script Gadget
OWASPも、フレームワークの安全機能を迂回するAPIを注意点として挙げています。
十分ではありません。
入力検証、出力エンコード、安全なDOM API、HTMLサニタイズ、CSP、Trusted Typesを組み合わせます。
完全ではありません。
設定不備、許可済みスクリプト、Script Gadget、ブラウザー差異などがあります。
CSPは根本修正の代わりではありません。
Trusted Typesは、主にクライアント側の危険なInjection Sinkを制御します。
W3C仕様では、サーバー生成マークアップへの注入を直接防ぐことは非目標として示されています。Server XSSには、テンプレートの自動エスケープやコンテキスト別の出力処理が必要です。
未エスケープ表示は危険です。
URI、User-Agent、Referer、攻撃ペイロードは、必ずプレーンテキストとして表示してください。
OWASP Cross Site Scripting Prevention Cheat Sheet。XSSのコンテキスト別防御、フレームワークの注意点、CSPだけへ依存する問題を整理しています。
OWASP DOM based XSS Prevention Cheat Sheet。DOM XSSのSource、Sink、実行コンテキストを整理しています。
OWASP Types of Cross-Site Scripting。Stored/ReflectedとServer/Clientの分類を整理しています。
W3C Trusted Types Working Draft。Injection Sinkを型付き値に制限する仕組みを定義しています。
W3C Content Security Policy Level 3。CSP Level 3の2026年時点の状態を確認できます。
Google ResearchのScript Gadget研究。正規JavaScriptを再利用する攻撃を説明しています。
Django 5.2公式セキュリティドキュメント。自動エスケープの保護範囲とアップロードファイルの注意点を説明しています。
この記事の公開前、記事機能だけでなく、サイト全体を対象にクロスサイトスクリプティング対策を再点検しました。サーバー側テンプレート、ブラウザー側DOM操作、リッチHTML、画面へ埋め込むJSON、リアルタイム通信、管理・通知系の表示経路を横断して確認しています。
反射型、格納型、DOM型に加え、Second-order、Blind、SVG・MathML、危険なURLスキーム、イベント属性、iframe/srcdoc、CSS、JSON埋め込み、WebSocketなどの経路を確認しました。安全確認には実害のない検証用データを使用し、外部送信や認証情報取得を行うコードは使用していません。
今回の改善では、出力コンテキストに応じたエスケープ、HTMLサニタイズ、安全なDOM API、セキュリティヘッダー、回帰テストを組み合わせています。CSPやWAFだけに依存せず、信頼できないデータが実行可能なSinkへ到達しない設計を優先しています。
なお、この追記では悪用可能な入力例、非公開URL、内部構成、検知回避につながる具体的手順は掲載していません。セキュリティ対策は継続作業であり、機能追加時にもSourceとSinkの追跡、依存ライブラリ更新、回帰テストを続けます。