Запутался в удаленно загружаемом содержимом JavaScript

Хорошо… всё ещё пытаюсь настроить отображение моего рекламного сервера на Discourse. Наткнулся на загадку, которую не могу разгадать. Используя функцию редактирования темы, я добавил свой скрипт-запрос и в </body>, и в ‘footer’.

Если добавить его в footer (или ‘after header’), код не работает. Хотя в режиме инспекции закодированный текст, кажется, корректен. См. ниже:

Текст “Where is this?” отображается, но ничего больше.

Однако тот же скрипт-запрос (ниже), добавленный в </body>, работает. Почему?

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

Я также пробовал добавить это в поле данных House Ads, и снова текст является частью закодированных данных на странице, но ничего не происходит.

creatives\&quot;:{\&quot;Leaderboard Ad\&quot;:\&quot;\\u003cscript language=\\\&quot;Javascript\\\&quot; src=\\\&quot;https://adserver.kitmaker.net/index.php?section=serve\\u0026action=1\\\&quot;\\u003e\&quot;}},\&quot;

Также я пока не могу заставить работать мои объявления Adsense отдельно, но, возможно, это проблема на их стороне, и они просто ещё не просканировали сайт, чтобы понять, что разместить. Странно, что это занимает так много времени.

Спасибо за любую помощь.

Джим

Надеюсь, разработчик это увидит. :slight_smile:

Можно попросить модератора переместить это в раздел поддержки или в другую подходящую категорию? Я оставил это без категории.

Спасибо. И извините, что так настойчиво прошу об этом, но у меня скоро дедлайн по развёртыванию, и мне действительно нужно разобраться с этой проблемой.

Хорошо, я заметил, что в логе CSP указывалось, что скрипт Google Ads блокируется, поэтому я добавил

https://pagead2.googlesyndication.com

в список script-src для CSP, и после этого мои объявления Google AdSense начали отображаться (немного удивило, что всё ещё приходится это делать, даже при установленном плагине AdSense). Однако я заметил, что когда мои внутренние объявления (House Ads) установлены на 100% (то есть вызывается только мой скрипт), в CSP нет никаких уведомлений о проблемах. Это возвращает меня к полной растерянности. Код внутренних объявлений находится в HTML (закодирован) и отображается в браузере так, как показано выше.

Неужели что-то блокирует вывод, но не вызывает предупреждение CSP?

Вывод использует document.write для создания места под рекламу. Я предполагаю, что проблема именно в этом. Вывод выглядит так:

Ха-ха… если бы я вставил вывод скрипта сюда в виде текста, он бы генерировался нормально. Ой…

Я нашёл пост с похожей проблемой, но этот человек разобрался сам и явно лучше разбирается в JavaScript, чем я.

Как и он, я готов заплатить кому-то за помощь в решении этой проблемы.

Спасибо,
Джим

Так что… это всё связано с CSP (я так полагаю), потому что для сайта установлено значение ‘unsafe-inline’, а я пытаюсь загрузить скрипт моего рекламного сервера по URL с переменными. Знаю… как это варварски с моей стороны.

Так что… кто-нибудь? Есть ли простое решение этой проблемы, или мне просто сдаться?

Правильное решение — не использовать inline-код, а переписать его так, чтобы он интегрировался с существующими слотами шаблонов EmberJS. Если вам нужно временное решение, вы можете отключить CSP в настройках сайта, пока работаете над изменениями в вашем кастомном решении для рекламы. Однако имейте в виду, что это может подвергнуть вас риску XSS-атак.

Также можно рассмотреть вариант добавления вашего сервера в форк плагина для рекламы, как это было сделано в этих PR: AdButler support by communiteq · Pull Request #80 · discourse/discourse-adplugin · GitHub, Carbon Ads Integration by barreeeiroo · Pull Request #73 · discourse/discourse-adplugin · GitHub или даже Add CodeFund Advertising option by coderberry · Pull Request #65 · discourse/discourse-adplugin · GitHub

Также, где объявлена политика безопасности контента? Я не вижу для неё никакого мета-тега. Это просто настройки по умолчанию HTML5, предполагаемые каждым браузером?

Проверьте Смягчение атак XSS с помощью политики безопасности контента

Спасибо, Фалько. Вместо того чтобы просто отключать всю защиту, есть ли способ добавить в белый список строки данных только для URL-адреса рекламного сервера и разрешить передачу этих переменных? Или… просто отключить требование «unsafe-inline» для данных?

К сожалению, в статье, на которую вы дали ссылку, этот вариант не описан.

Спасибо еще раз.

Ладно, полагаю, я отчаялся, потому что я попытался полностью отключить CSP…

И всё же реклама не отображается в основной части сайта, только в подвале, где она установлена в теме внутри тега </body>. Я заметил, что центральный секция обернута в тег <noscript>, а код в подвале находится за пределами закрывающего тега </noscript>, возможно, поэтому?

Я проверил в Firefox, и теперь в консоли нет предупреждений о CSP. Не понимаю, почему я изначально не видел их в Chrome.

Discourse — это одностраничное приложение, и вся разметка страниц создаётся на стороне клиента с помощью нашего приложения на EmberJS.

Прямая манипуляция DOM, такая как document.write, вступает в прямое противоречие с архитектурой приложения и имеет крайне низкие шансы на то, что всё «просто заработает».

Я рекомендую адаптировать вашу рекламную систему для использования нашей системы House Ads в официальном плагине для рекламы. Возможно, вы сможете разместить одно объявление в инвентаре House Ads и использовать хук изменения страницы для обращения к рекламному серверу и замены объявления на полученный ответ? Или, возможно, ваша рекламная система может напрямую записывать данные в инвентарь House Ads через API?

Спасибо за помощь, Фалько. Немного страшно, но исходный код этого рекламного сервера был написан до появления термина API, так что… да, мне было бы лучше написать совершенно новую систему рекламного сервера с нуля. Просто у меня сейчас нет на это времени, так как я разворачиваю этот новый форум и 6+ новых сайтов с контентом.

Я попробую поэкспериментировать с альтернативными вариантами использования document.write и посмотрю, сработает ли это.

С уважением,
Джим