Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
Since February 2026, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
メモ: この機能はウェブワーカー内で利用可能です。
信頼型 API (Trusted Types API) を使用することで、ウェブ開発者は、入力データが実行される可能性のある API に渡される前に、ユーザー指定の変換関数を通すようにすることができます。これによって、クライアント側の クロスサイトスクリプティング (XSS) 攻撃からの防御を強化できます。最も一般的なのは、変換関数が入力をサニタイズすることです。
クライアント側(DOM ベース)の XSS 攻撃は、攻撃者が細工したデータが、そのデータをコードとして実行するブラウザー API に渡された際に現れます。これらの API は、インジェクションシンクとして知られています。
信頼型 API では、インジェクションシンクを次の 3 種類に分類しています。
DOM ベースの XSS 攻撃に対する主な防御策の一つは、入力をインジェクション先へ渡す前に、その安全性を確実に実現することです。
信頼型 API では、開発者は「ポリシーオブジェクト」を定義します。このオブジェクトには、インジェクションシンクへの入力データを安全なものに変換するメソッドが含まれています。ポリシーでは、シンクの種類ごとに異なるメソッドを定義することができます。
その後、信頼型 API は、入力がシンクに渡される前に、適切な変換関数を必ず通過するようにします。
つまり、この API を利用すれば、ポリシーを一ヶ所で定義することができるので、インジェクションシンクに渡されるすべてのデータが確実にそのポリシーを通過するようになります。
メモ:
信頼型 API 自体は、ポリシーや変換関数を提供しません。開発者は、適用したい変換を含む独自のポリシーを定義します。
この API には、主に 2 つの部分があります。
信頼型 API では、次のようなことが言えます。
この API を使用すると、innerHTML のようなインジェクションシンクに文字列を渡す代わりに、TrustedTypePolicy を使用してその文字列から TrustedHTML オブジェクトを作成し、それをシンクに渡すようにすることができます。これにより、文字列が変換関数を通じて処理されたものであることが保証されます。
例えば、このコードは、DOMPurify ライブラリーを使用して入力文字列をサニタイズすることで、TrustedHTML オブジェクトを作成できる TrustedTypePolicy を作成します。
次に、この policy オブジェクトを使用して TrustedHTML オブジェクトを作成し、そのオブジェクトをインジェクションシンクに渡すことができます。
上記の API はデータの無害化をすることができるのですが、コードがインジェクションシンクに直接入力を決して渡さないことを保証するものではありません。つまり、文字列を innerHTML に渡すことを阻止するわけではないのです。
信頼型が常に渡されるように強制するには、require-trusted-types-for ディレクティブを CSP に記載します。 このディレクティブを設定した場合、インジェクションシンクに文字列を渡すと TypeError 例外が発生します。
さらに、CSP の trusted-types ディレクティブを使用することで、コードが作成できるポリシーを制御することができます。trustedTypes.createPolicy() を使用してポリシーを作成する際は、ポリシーの名前を引数として渡します。CSP の trusted-types ディレクティブには、受け入れられるポリシー名を列挙しますので、createPolicy() に、trusted-types に列挙されていない名前が 渡された場合、例外が発生します。これにより、ウェブアプリケーション内のコードが、想定外のポリシーを作成することを防ぐことができます。
信頼型 API では、デフォルトポリシーを定義することができます。これにより、コード内でまだ文字列をインジェクションシンクに渡している場所を探すことができるため、代わりに信頼型を生成して渡すようにコードを書き換えることが可能です。
"default" という名前のポリシーを作成し、CSP で信頼型の使用が強制されている場合、インジェクションシンクに渡される文字列引数はすべて、自動的にこのポリシーに渡されます。例えば、次のようなポリシーを作成するとします。
このポリシーでは、コードで innerHTML に文字列を代入すると、ブラウザーはポリシーの createHTML() メソッドを呼び出し、その結果をシンクに代入します。
デフォルトのポリシーが null または undefined を返した場合、その結果をシンクに代入すると、ブラウザーは TypeError を発生させます。
メモ: 入力データをインジェクションシンクに直接渡す古いコードから、信頼型を明示的に使用するコードへ移行する間のみ、デフォルトのポリシーを使用することをお勧めします。
この章では、「直接的」インジェクションシンクインターフェイスの一覧を提供しています。
これらは、評価時に信頼型のチェックを行うAPIのプロパティおよびメソッドです。 これらは、文字列だけでなく信頼型(TrustedHTML、TrustedScript、TrustedScriptURL)も受け取ることができます。また、信頼型の強制が有効で、デフォルトのポリシーが定義されていない場合は、信頼型を渡す必要があります。
間接的インジェクションシンクとは、信頼型を受け入れず、また強制もしない中間メカニズムを介して、信頼できない文字列が DOM に注入されるシンクのことです。 これらは、前のセクションで掲載されている「直接的」なインジェクションシンクインターフェイスとは異なります。後者は、呼び出された際に注入された文字列に対して信頼型チェックを実行します。
例えば、次のコードは script 要素の source を間接的に設定しています。 まず、ユーザーから指定された文字列を使用してテキストノードを作成し、次に <script> 要素を構築して、そのテキストノードを子要素として追加します。 次に、その script 要素を <body> 要素の子として文書に追加します。この時点で、元の文字列に定義されたスクリプトが実行される可能性があります。
テキストノードが生成された時点では、ブラウザーがそのノードが信頼型のソースとして使用されることを仮定する理由がないため、信頼型は文字列としてシリアライズされ、強制されません。
その代わりに、ブラウザーはスクリプト要素が実行可能になった時点でチェックを実行します。つまり、この例では、document.body.appendChild(script) が呼び出されてスクリプト要素が文書に追加された時点です。
ブラウザーはまず、スクリプトの内容として使用する文字列が信頼できるものかどうかを調べます。 <script> のテキストソースを、TrustedScript を明示的に設定せずに、変更することができる操作を行うと、そのスクリプトは信頼できないものとみなされます。 以上で使用したNode.appendChild()メソッドは、あくまで一例に過ぎません(その他の例については、https://wpt.live/trusted-types/script-enforcement-001.html の WPT Live テストに多数掲載されています)。
その文字列が信頼されていない場合、かつ信頼型が強制されている場合、ブラウザーは代わりにソースとして使用する TrustedScript をデフォルトポリシーから取得しようとします。 デフォルトポリシーが定義されていなかったり、または TrustedScript を返さなかったりした場合、操作で例外が発生します。
信頼型 API は、まだすべての現行ブラウザーで利用可能ではありませんが、W3C が作成した互換性支援ツールのおかげで、現在ではどこでも利用可能です。
これら 2 つのポリフィルに加え、W3C は tinyfill と呼ばれるものを提供しており、これについては下記で詳しく説明します。
なお、CSP の強制が有効になっている対応ブラウザーでコードのテストを行っていれば、それ以外のブラウザーでは上記の完全なポリフィルを使用する必要はありません。API のみのポリフィルや tinyfill を使用しても、同様の効果を得ることができます。
これは、この強制措置により、すべてのデータがインジェクションシンクに渡される前に信頼型 API を経由して(そして結果的に無害化関数を通して)確実に実現することが求められるためです。 その後、リファクタリングしたコードを、強制措置が適用されていないさまざまなブラウザーで実行しても、同じコードパスを通るため、同様の保護が得られます。
この節では、信頼型 tinyfill が、信頼型の対応をまったく追加していないにもかかわらず、どのようにウェブサイトを保護できるかについて見ていきます。
信頼型 tinyfill は、次のようなものだけです。
これは、渡された policyOptions オブジェクトをそのまま返す trustedTypes.createPolicy() の実装を提供します。policyOptions オブジェクトはデータの無害化関数を定義しており、これらの関数は文字列を返すものと想定されています。
この tinyfill を導入した上で、ポリシーを作成するとします。
信頼型に対応しているブラウザーでは、この TrustedTypePolicy が返され、policy.createHTML() を呼び出すと TrustedHTML オブジェクトが作成されます。この TrustedHTML オブジェクトをインジェクションシンクに渡すことで、シンクが文字列ではなく信頼型を受け取るように強制することができます。
信頼型に対応していないブラウザーでは、このコードは、入力を無害化し文字列として返す createHTML() 関数を持つオブジェクトを返します。無害化された文字列は、その後、インジェクションシンクに渡すことができます。
どちらの場合でも、インジェクションシンクは無害化されたデータを受け取ります。また、対応しているブラウザーではポリシーの使用を可能にするため、このコードパスは未対応ブラウザーにおいても無害化関数を踏むことがわかります。
HTML としてレンダリングされる、インジェクションシンクに挿入される文字列を表します。
TrustedScriptスクリプトの実行につながる可能性のある、インジェクションシンクに挿入される文字列を表します。
TrustedScriptURL外部スクリプトのURLとして構文解析される、インジェクションシンクに挿入する文字列を表します。
TrustedTypePolicy上記の信頼型オブジェクトを作成する際に使用される関数を定義します。
TrustedTypePolicyFactoryポリシーを作成し、信頼型オブジェクトのインスタンスがそれらのポリシーのいずれかを通じて作成されたことを確認します。
メインスレッドのグローバルオブジェクトに関連付けられた TrustedTypePolicyFactory オブジェクトを返します。 これは、Window スレッドで API を使用するためのエントリーポイントです。
WorkerGlobalScope.trustedTypes.ワーカー内のグローバルオブジェクトに関連付けられた TrustedTypePolicyFactory オブジェクトを返します。
信頼型が DOM XSS インジェクションシンクに渡されるようにします。
trusted-types信頼型ポリシーの名前の許可リストを指定するために使用します。
eval() や類似の関数の使用を許可しますが、信頼型に対応しており、かつ適用されている場合に限ります。
次の例では、TrustedHTML オブジェクトを作成するポリシーを TrustedTypePolicyFactory.createPolicy() で作成します。その後、TrustedTypePolicy.createHTML() を使用して、文書内に挿入するサニタイズ済みの HTML 文字列を作成することができます。
この無害化された値は、Element.innerHTML と共に使用することで、新しい HTML 要素が挿入されないように実現することができます。
この例の詳細や、入力を無害化するその他の方法については、記事 Prevent DOM-based cross-site scripting vulnerabilities with Trusted Types をご覧ください。
| Trusted Types |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2026年5月10日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.