Мы проводим эксперимент с новым CSP «strict-dynamic», который должен значительно упростить безопасную интеграцию тем, плагинов и внешних скриптов в Discourse.
Вы можете опробовать новый режим, включив настройку сайта «content security policy strict dynamic». Пожалуйста, дайте нам знать, если у вас есть отзывы!
Мы надеемся сделать это значение по умолчанию в ближайшем будущем и создадим тему #announcements, когда будем приближаться к этой цели.
Дополнительную информацию см. ниже:
Предыстория
Ещё в 2018 году мы внедрили политику безопасности контента (Content Security Policy) по умолчанию для Discourse. На тот момент наша политика поддержки браузеров означала, что мы были ограничены использованием значений «host-source» (то есть перечислением префиксов URL для каждого разрешённого скрипта).
Сейчас, в 2024 году, доступно больше вариантов, а именно ключевое слово 'strict-dynamic'. Это устраняет необходимость заранее перечислять все URL-адреса скриптов. Вместо этого любые изначально доверенные скрипты (через значение «hash» или «nonce») могут загружать дополнительные скрипты с минимальными ограничениями.
Как попробовать новый режим?
Включите настройку «content security policy strict dynamic» в панели администратора.
Если вы не видите эту настройку, убедитесь, что у вас установлена последняя версия Discourse. Новая функция была объединена 16 февраля (в цикле 3.3.0.beta1-dev).
Если вы используете наш хостинг и хотите ускорить обновление, просто сообщите нам об этом!
Что произойдёт, если я включу новую настройку?
Директива script-src заголовка Content-Security-Policy будет обновлена и включит одно значение nonce- и ключевое слово 'strict-dynamic'.
Все начальные теги <script> в ядре и в темах автоматически получат соответствующий атрибут nonce=. Никаких дополнительных действий от администраторов или разработчиков тем не требуется.
Плагины, которые внедряют свои собственные теги <script>, необходимо обновить для поддержки нового режима (пример). Мы собираем данные о распространённости этой ситуации и при необходимости предоставим рекомендации разработчикам.
Любые значения host-source, которые вносят темы или плагины, будут автоматически игнорироваться (браузеры не поддерживают host-source одновременно со strict-dynamic).
А как насчёт внешних скриптов, таких как GTM, аналитика, реклама и т. д.?
Они должны работать «из коробки» без необходимости дополнительной настройки. Дайте нам знать, если возникнут какие-либо проблемы!
Можно ли это отменить?
Да! Пока мы проводим эксперимент, вы можете включать и выключать эту настройку, и изменения вступят в силу немедленно.
Примеры политик
Пример политики Discourse до этого изменения:
upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src https://meta.discourse.org/logs/ https://meta.discourse.org/sidekiq/ https://meta.discourse.org/mini-profiler-resources/ https://d11a6trkgmumsb.cloudfront.net/assets/ https://meta.discourse.org/extra-locales/ https://d3bpeqsaub0i6y.cloudfront.net/highlight-js/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/ https://d3bpeqsaub0i6y.cloudfront.net/theme-javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/svg-sprite/ 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0=' 'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=';
worker-src 'self' https://d11a6trkgmumsb.cloudfront.net/assets/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/;
frame-ancestors 'self';
manifest-src 'self';
Пример политики Discourse после этого изменения:
upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src 'nonce-78uQrKOCg78iGuMAwCq2lI9E7' 'strict-dynamic';
frame-ancestors 'self';
manifest-src 'self';
Ресурсы
Документация MDN по strict-dynamic