リモートで読み込まれたJavaScriptコンテンツについて混乱しています

はい、まだ Discourse で広告サーバーを表示させるための取り組みを続けています。ここで、どうにも解決できない謎に遭遇しました。テーマ編集機能を使って、スクリプトのリクエストを <body> と「フッター」の両方に追加しました。

フッター(または「ヘッダー後」)に追加すると、コードが機能しません。 inspection モードでは、エンコードされたテキストが正しいように見えるのにです。以下をご覧ください:

「Where is this?」というテキストは表示されますが、それ以外は何も表示されません。

しかし、同じスクリプトリクエスト(以下)を <body> に追加すると動作します。なぜでしょうか?

<script language="Javascript" src="https://adserver.kitmaker.net/index.php?section=serve&action=1">

これを「House Ads」のデータフィールドに追加しても試してみましたが、やはりテキストはページ上のエンコードされたデータの一部として存在するものの、何も表示されません。

creatives\":{\"Leaderboard Ad\":\"<script language=\"Javascript\" src=\"https://adserver.kitmaker.net/index.php?section=serve&action=1\">\"}},\"

また、Adsense の広告単体でもまだうまく動作させられていません。もしかすると相手側の問題で、まだサイトをスキャンして何を掲載すべきか確認していないのかもしれません。しかし、こんなに時間がかかるのは奇妙ですね。

どなたかご助力いただけますと幸いです。

Jim

開発者の方がこれを見てくださるといいですね。:slight_smile:

モデレーターの方にご依頼したいのですが、このトピックを「サポート」または適切なカテゴリに移動していただけないでしょうか。現在、カテゴリが未設定のままです。

ご協力ありがとうございます。また、このような催促をしてしまい申し訳ありませんが、デプロイの期限が迫っており、この問題を解決する必要があります。

CSP ログに Google 広告スクリプトがブロックされていると表示されていたため、以下のドメインを CSP の script-src リストに追加しました。

https://pagead2.googlesyndication.com

すると、Google AdSense の広告が表示されるようになりました(AdSense プラグインがインストールされていても、まだこれを行う必要があるとは驚きです)。ただし、私が気づいたのは、House Ads を 100% に設定(つまり、スクリプトのみが呼び出される状態)した場合、CSP には何も問題の通知が来ないということです。これでは再び混乱してしまいます。House Ad のコードは HTML 内にエンコードされており、ブラウザの検査ビューでは上記のように表示されます。

何か出力をブロックしているが、CSP の警告はトリガーしない要因があるのでしょうか?

出力は document.write を使用して広告スペースを作成しています。これが原因ではないかと推測しています。出力は以下のようになります。

笑えますが…スクリプトの出力をここにテキストとして貼り付けると、問題なく生成されていました。しまった…

同様の問題について投稿を見つけましたが、その方は自分で解決しており、私よりも明らかに JavaScript に詳しいようです。

彼と同じく、この件について誰かに有料でサポートを依頼する用意があります。

よろしくお願いいたします、
Jim

つまり、これはすべて CSP(コンテンツセキュリティポリシー)に関連する問題(私はそう推測します)で、サイトが「unsafe-inline」データに設定されており、変数を含む URL で広告サーバーのスクリプトを取得しようとしています。なんて野蛮な方法でしょうか。

さて、どなたかいますか?これに対する簡単な解決策はあるでしょうか、それともあきらめるべきでしょうか?

適切な修正方法はインラインを使用せず、既存の EmberJS テンプレートのアウトレットにフックするように書き換えることです。応急処置として、カスタム広告ソリューションの変更を進める間は、サイト設定で CSP を無効にすることもできます。ただし、これにより XSS のリスクにさらされる可能性がある点にご注意ください。

また、以下のプルリクエストのように、広告プラグインのフォークにサーバーを追加する方法を検討することもできます:

また、コンテンツセキュリティポリシー(CSP)はどこで宣言されていますか?それに対応するメタタグは見当たりません。これは、各ブラウザがデフォルトで HTML5 の設定を適用しているだけでしょうか?

コンテンツセキュリティポリシーによる XSS 攻撃の緩和 を確認してください。

Falco さん、ありがとうございます。すべての保護を無効にするのではなく、adserver の URL に対してのみデータ文字列をホワイトリストに登録し、それらの変数を通過させる方法はありますか?あるいは、「unsafe-inline」データの要件を無効にする方法はありませんか?

残念ですが、リンクされた記事にはそのオプションについての記載が見当たりませんでした。

再度、ありがとうございます。

まあ、私が切羽詰まっているに違いないな。CSP を完全に無効にしようとしたのだから。

それでも、広告はサイトのメインセクションには表示されず、テーマの </body> に設置されているフッター部分にしか表示されない。中央部分には <noscript> ラッパーがあることに気づいたが、フッター側のコードは </noscript> の閉じタグの外にある。それが原因かもしれない。

Firefox で確認したところ、コンソールには CSP の警告は表示されなくなった。なぜ最初から Chrome で警告が表示されなかったのかはわからない。

Discourse はシングルページアプリケーションであり、すべてのページマークアップは当社の EmberJS アプリケーションを介してクライアント側で生成されます。

document.write のような直接 DOM 操作を使用することは、この仕組みと完全に矛盾しており、「そのまま動作する」可能性は極めて低いです。

公式アドプラグインのハウス広告システムを広告システムに適用することをお勧めします。ハウス広告の在庫に単一の広告を配置し、ページ変更フックを使用して広告サーバーに接続し、レスポンスで広告を置き換える方法はいかがでしょうか?あるいは、広告システムが API を介して直接ハウス広告の在庫に書き込むことも可能かもしれません。

お助けいただきありがとうございます、Falco さん。少し怖いですね。この広告サーバーのコードベースは、API という用語が生まれる前に書かれたものでしたから……そうですね、最初から全く新しい広告サーバーシステムを書き直す方が私にとっては良い選択かもしれません。ただ、今すぐその時間はありません。新しいフォーラムと 6 つ以上の新しいコンテンツサイトを同時に展開しているためです。

document.write を使わない別のオプションをいくつか試してみて、それが機能するかどうか確認してみます。

では、
Jim