我们正在试验一种新的“strict-dynamic”CSP,它应该能让 Discourse 更轻松、更安全地集成主题、插件和外部脚本。
您可以通过启用 “content security policy strict dynamic” 站点设置来尝试新模式。如果您有任何反馈,请告知我们!
我们希望在不久的将来将其设为默认设置,并在接近该目标时发布一个 Announcements 主题。
有关更多信息,请参阅下文:
背景
早在 2018 年,我们就为 Discourse 引入了默认的内容安全策略。当时,我们的浏览器支持策略意味着我们只能使用“host-source”值(即列出所有允许的脚本的 URL 前缀)。
现在是 2024 年,有了更多的选项:即“‘strict-dynamic’”关键字。这消除了预先列出所有脚本 URL 的需要。相反,任何最初受信任的脚本(通过“hash”或“nonce”值)都可以加载更多脚本,限制最少。
如何尝试新模式?
在您的管理面板中启用 “content security policy strict dynamic” 设置。
如果您没有看到该设置,请确保您运行的是最新版本的 Discourse。新功能已于 2 月 16 日合并(在 3.3.0.beta1-dev 周期期间)。
如果您使用我们的托管服务并希望加快更新速度,请告知我们!
启用新设置后会发生什么?
Content-Security-Policy 的 script-src 指令将被更新,以包含单个 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';