Show Menu
トピック×

コンテンツセキュリティポリシー(CSP)

コンテンツセキュリティポリシー(CSP)の主な目的は、クロスサイトスクリプティング攻撃(XSS)を防止することです。この攻撃は、悪意のあるコンテンツが、実際は別の場所から送られているのに、信頼されたソースから来たように見せかけ、ブラウザーを騙して実行させるときに発生します。CSP を使用すれば、ブラウザーは(ユーザーの代理として)、スクリプトが実際に信頼できるソースから送られたものであることを検証できます。
CSP は、 Content-Security-Policy HTTP ヘッダーをサーバー応答に追加することで実装されます。CSP について詳しくは、Mozilla 開発者ネットワークサイト https://developer.mozilla.org/ja/docs/Web/HTTP/CSP を参照してください。

克服すべき課題

タグ管理システムは、スクリプトを動的に読み込むように作られています。これらの動的に読み込まれるスクリプトはセキュリティの問題を引き起こす可能性があるので、CSP はこれらをブロックするよう作られています。
Launch を CSP と連携させるには、2 つの主な課題を克服する必要があります。
  • Launch ライブラリのソースを信頼する必要があります。 ​この条件が満たされない場合、Launch ライブラリおよびその他の必要な JavaScript ファイルはブラウザーでブロックされ、ページに読み込まれません。
  • インラインスクリプトを許可する必要があります。 ​この条件が満たされない場合、カスタムコードルールのアクションはページ上でブロックされ、正しく実行されません。
Launch を使用し、 さらに CSP を配置する場合、他のスクリプトを誤って「安全」とすることなく、これらの問題の両方を修正する必要があります。セキュリティを向上させようとすると、ユーザーの作業量が増加します。

信頼できるソース

ライブラリを自己ホストしている場合、ライブラリのソースはおそらくユーザー自身のライブラリになります。次のように、ホストドメインが安全なソースであることを指定できます。
script-src 'self'
ライブラリを(アドビが管理するホストを使用して)アドビでホストしている場合、ライブラリは assets.adobedtm.com 上で管理されます。この場合、ポリシーを次のように設定します。
script-src 'self' assets.adobedtm.com
既に読み込んでいるスクリプトを壊さないよう、安全なドメインとして self を指定する必要がありますが、 assets.adobedtm.com を「安全」としてもリストする必要があります。そうしない場合、Launch ライブラリがページに読み込まれません。
信頼できるソースの詳細については、 Mozilla Developer Network サイト を参照してください。

インラインスクリプト

インラインスクリプトはデフォルトでは許可されていないので、CSP には課題があります。インラインスクリプトを許可するには、次の 2 つのオプションがあります。
  • すべてのインラインスクリプトを許可する(セキュリティレベル最低)
  • ナンスで許可(セキュリティレベル高)
CSP の仕様には、ハッシュを使用する 3 番目のオプションの詳細が含まれていますが、多くの理由により、このアプローチはどの種類の TMS も使用するのが難しく、中には非常に複雑なものもあります。

優れたセキュリティ — ナンス

この方法では、ナンスを生成し、それを CSP と各インラインスクリプトに追加します。ブラウザーは、ナンスを含むインラインスクリプトを読み込む命令を受け取ると、ナンス値と CSP ヘッダー内に含まれる値を比較します。一致すると、スクリプトが読み込まれます。
このナンスは、新しいページが読み込まれるたびに変更される必要があります。
非常に重要な前提条件があります。Launch ライブラリは 非同期で 読み込む必要があります。Launch ライブラリの同期読み込みでは動作しません(コンソールエラーやルールが正しく実行されない原因となります)。
次のように、上記のアドビがホストする CSP にナンスを追加できます。
script-src 'self' assets.adobedtm.com 'nonce-2726c7f26c'
その後、ナンスをどこで見つけるかを Launch に伝える必要があります。Launch は、インラインスクリプトの読み込み時にこれを使用します。Launch でスクリプトの読み込み時にナンスを使用するには、以下を実行する必要があります。
  1. (データレイヤーに配置した任意の場所の)ナンスを参照するデータ要素を作成します。
  2. コア拡張機能を設定し、使用したデータ要素を指定します。
  3. データ要素とコア拡張機能の変更を公開します。
追加の注意:これは、カスタムコードの読み込みのみを処理します。カスタムコードでの実行内容を処理しません。CSP に準拠していないカスタムコードを記述することが可能です。この場合、CSP が優先されます。例えば、カスタムコードを使用してインラインスクリプトを DOM に追加して読み込む場合、Launch はそれを見つけたり、ナンスを正しく追加したりできないので、特定のカスタムコードアクションが期待どおりに動作しません。

低レベルのセキュリティ — インラインを許可

上記のオプションが機能しない場合は、CSP に対し、すべてのインラインスクリプトを許可するよう伝えることができます。このオプションの安全性はあまり高くありませんが、実施やメンテナンスは容易です。
アドビでホスティングを管理しており、 assets.adobedtm.com ドメインを信頼できるソースとしてマークすると想定すると、CSP は次のようになります。
script-src 'self' assets.adobedtm.com 'unsafe-inline'
インラインスクリプトの許可について詳しくは、MDN サイトの https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/script-src を参照してください。