FlawOpen

flawopen.com/JavaScriptのXSS/Svelte

SvelteはデフォルトでXSSを防げる?

リファレンスページ
やさしい説明

`{comment}` は印刷されたメモのようなものです。山かっこも文字として表示されます。`{@html comment}` は、ページ上の記号を組版指示として扱うよう依頼することに似ています。信頼できない情報源の記号を渡すと、ブラウザーがHTMLとして解釈し、XSSにつながる可能性があります。

要注意
<p>{@html comment}</p>
// 値は実際のHTMLマークアップとして解釈される
安全
<p>{comment}</p>
// 自動的にエスケープされる

基本ルール

Svelteは通常の {expression} 出力をエスケープ済みテキストとしてコンパイルするため、値がHTMLとして解釈されることはありません。一方、{@html} は意図的にHTML文字列を描画します。SvelteのドキュメントはXSS防止のため、値をエスケープするか信頼できる値だけを使うよう警告しています。このディレクティブを重要なHTML挿入箇所として扱い、ユーザー作成のリッチテキストには保守されているサニタイザーを使用してください。

コードベースの確認方法

`.svelte` ファイルで `{@html}` を検索します。各箇所について、値の出所とすべての変換を追跡してください。ユーザー入力、外部データ、保存されたユーザーコンテンツは信頼できないものとして扱います。テキスト表示なら `{expression}` を使います。リッチHTMLが必要な場合は、保守されているHTMLサニタイザーで処理し、許可されていないマークアップが除去されることをテストしてください。

grep -rn "{@html" --include="*.svelte" .

リッチ HTML:サニタイズの境界を保つ

内容をテキストとして表示する場合は `{expression}` を使います。ユーザーが HTML を作成する必要がある場合は、保守されている HTML サニタイザー(DOMPurify など)で最終的な内容をサニタイズしてから `{@html}` に渡してください。サニタイズ後に文字列を連結したり変更したりすると、保護が無効になる可能性があります。サニタイザーを最新に保ち、製品に必要なマークアップ要素と属性だけを許可してください。HTML のサニタイズは、同じ値を JavaScript、CSS、URL のコンテキストで安全にするものではありません。

参考資料

関連項目 クロスサイトスクリプティング(XSS、CWE-79)の仕組みと各言語での防ぎ方 — flawopen.com SVG アップロードは XSS のリスクになりますか? Vue v-htmlのXSSリスクと安全な使い方 WKWebView loadHTMLString は未信頼コンテンツに安全? 反射型・格納型・DOM ベース XSS の違いは? Android addJavascriptInterface のセキュリティリスク Angular の XSS 対策:安全な既定動作とバイパス API