(Устарело) Эксперименты со строгой динамической политикой безопасности контента (CSP)

Мы проводим эксперимент с новым CSP «strict-dynamic», который должен значительно упростить безопасную интеграцию тем, плагинов и внешних скриптов в Discourse.

Вы можете опробовать новый режим, включив настройку сайта «content security policy strict dynamic». Пожалуйста, дайте нам знать, если у вас есть отзывы!

Мы надеемся сделать это значение по умолчанию в ближайшем будущем и создадим тему #announcements, когда будем приближаться к этой цели.

Дополнительную информацию см. ниже:


:scroll: Предыстория

Ещё в 2018 году мы внедрили политику безопасности контента (Content Security Policy) по умолчанию для Discourse. На тот момент наша политика поддержки браузеров означала, что мы были ограничены использованием значений «host-source» (то есть перечислением префиксов URL для каждого разрешённого скрипта).

Сейчас, в 2024 году, доступно больше вариантов, а именно ключевое слово 'strict-dynamic'. Это устраняет необходимость заранее перечислять все URL-адреса скриптов. Вместо этого любые изначально доверенные скрипты (через значение «hash» или «nonce») могут загружать дополнительные скрипты с минимальными ограничениями.

:eyes: Как попробовать новый режим?

Включите настройку «content security policy strict dynamic» в панели администратора.

Если вы не видите эту настройку, убедитесь, что у вас установлена последняя версия Discourse. Новая функция была объединена 16 февраля (в цикле 3.3.0.beta1-dev).

Если вы используете наш хостинг и хотите ускорить обновление, просто сообщите нам об этом!

:thinking: Что произойдёт, если я включу новую настройку?

Директива script-src заголовка Content-Security-Policy будет обновлена и включит одно значение nonce- и ключевое слово 'strict-dynamic'.

Все начальные теги <script> в ядре и в темах автоматически получат соответствующий атрибут nonce=. Никаких дополнительных действий от администраторов или разработчиков тем не требуется.

Плагины, которые внедряют свои собственные теги <script>, необходимо обновить для поддержки нового режима (пример). Мы собираем данные о распространённости этой ситуации и при необходимости предоставим рекомендации разработчикам.

Любые значения host-source, которые вносят темы или плагины, будут автоматически игнорироваться (браузеры не поддерживают host-source одновременно со strict-dynamic).

:technologist: А как насчёт внешних скриптов, таких как GTM, аналитика, реклама и т. д.?

Они должны работать «из коробки» без необходимости дополнительной настройки. Дайте нам знать, если возникнут какие-либо проблемы!

:recycle: Можно ли это отменить?

Да! Пока мы проводим эксперимент, вы можете включать и выключать эту настройку, и изменения вступят в силу немедленно.

:writing_hand: Примеры политик

Пример политики 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';

:open_book: Ресурсы

Документация MDN по strict-dynamic

Документация Google по «Strict CSP»

CSP Evaluator

Информация о поддержке браузерами в Caniuse

22 лайка

Поскольку директива strict-dynamic в CSP является обязательной в версиях Discourse начиная с v3.3.0.beta3, мы обновили статью Mitigate XSS Attacks with Content Security Policy, и данная тема будет закрыта.

2 лайка