Document: parseHTMLUnsafe() 静的メソッド
Baseline
2025
Newly available
Since September 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
警告: このメソッドは、入力を HTML として構文解析し、DOM に書き込みます。 このような API はインジェクションシンクと呼ばれ、入力が攻撃者から来たものであれば、クロスサイトスクリプティング (XSS)攻撃の経路となる可能性があります。
このリスクを軽減するには、文字列の代わりに常に TrustedHTML オブジェクトを割り当て、信頼型を強制するようにしてください。
詳しくはセキュリティの注意事項を参照してください。
メモ:
このメソッドの代わりには、対応しているブラウザーでは、ほぼ常に Document.parseHTML() を使用しましょう。なぜなら、このメソッドは常に XSS のリスクがある HTML エンティティを除去するからです。
parseHTMLUnsafe() は Document オブジェクトの静的メソッドで、HTML 入力を構文解析し、オプションで不要な HTML 要素や属性を除外して、新しい Document インスタンスを生成するために使用されます。
構文
Document.parseHTMLUnsafe(input)
Document.parseHTMLUnsafe(input, options)
引数
input-
構文解析する HTML を定義する
TrustedHTMLインスタンスまたは文字列です。 options省略可-
以下のオプション引数を持ったオプションオブジェクトです。
sanitizer省略可-
入力のどの要素を許可することができるかまたは除去されるかを定義する、
SanitizerまたはSanitizerConfigオブジェクトです。 これは、値が"default"の文字列でもよく、その場合は(XSS 対策済みの)デフォルトのサニタイザー設定を持つSanitizerが適用されます。 指定がない場合は、サニタイザーは使用されません。なお、同じ設定を複数回使用する場合は、
Sanitizerを使用し、必要に応じてそれを変更する方が効率的であると考えられます。
返値
Document です。
例外
TypeError-
これは次の場合に発生します。
htmlが文字列で渡された場合(信頼型がCSP によって強制されており、デフォルトポリシーが定義されていない場合)。options.sanitizerに次のいずれかが渡された場合。SanitizerConfigが有効でないもの。 例えば、"allowed" と "removed" の両方の設定項目を含む構成などです。"default"以外の値の文字列。Sanitizer、SanitizerConfig、文字列のいずれでもない値。
解説
parseHTMLUnsafe() 静的メソッドを使用すると、新しい Document インスタンスを生成し、必要に応じて不要な要素や属性をフィルタリングすることができます。
生成される Document のコンテンツタイプは "text/html"、文字セット は UTF-8、URL は "about:blank" となります。
入力 HTML には、宣言型シャドウルートが含まれている場合があります。
HTML の文字列が具体的なシャドウホスト内で複数の宣言型シャドウルートを定義している場合、最初のShadowRootのみが生成されます。それ以降の宣言は、そのシャドウルート内の<template>要素として構文解析されます。
parseHTMLUnsafe() は、デフォルトで無害化処理を行いません。
サニタイザーが引数として渡されなかった場合、入力に含まれるすべての HTML エンティティが挿入されます。
セキュリティの注意事項
メソッド名の接尾辞 "Unsafe" は、このメソッドがすべての XSS リスクのある HTML エンティティの除去を強制しないことを示しています(Document.parseHTML()とは異なります)。
適切なサニタイザーと併用すればそのように動作させることができますが、効果的なサニタイザーを保有する必要はなく、サニタイザー自体を使用しなくてもよいのです!
したがって、このメソッドは、ユーザーから指定された潜在的に安全でない文字列が、先に無害化されることなく DOM に注入される、クロスサイトスクリプティング (XSS)攻撃の攻撃経路となり得ます。
このリスクを軽減するには、文字列の代わりに常に TrustedHTML オブジェクトを渡すようにし、CSP の require-trusted-types-for ディレクティブを使用して信頼型を強制することで、このリスクを軽減する必要があります。
これにより、入力は変換関数を通過することになり、挿入される前に入力を無害化して、潜在的に危険なマークアップ(<script> 要素やイベントハンドラー属性など)を除去することが可能になります。
TrustedHTML を使用することで、無害化処理のコードが有効であるかどうかを、すべてのインジェクション・シンクに散在させるのではなく、わずかな場所だけで監査・検査することができます。
TrustedHTML を使用する場合、メソッドに無害化処理関数を渡す必要はありません。
何らかの理由で TrustedHTML (あるいは、さらに望ましいのは setHTML())を使用できない場合は、次に安全な選択肢として、XSS 対策済みの デフォルトのサニタイザー設定 とともに setHTMLUnsafe() を使用することをお勧めします。
仕様書
| Specification |
|---|
| HTML> # dom-parsehtmlunsafe> |
ブラウザーの互換性
関連情報
Document.parseHTML()Element.setHTML()およびElement.setHTMLUnsafe()ShadowRoot.setHTML()およびShadowRoot.setHTMLUnsafe()DOMParser.parseFromString(): HTML または XML を DOM ツリーに入れる- HTML 無害化 API