内容安全策略多重随机数

Posted

技术标签:

【中文标题】内容安全策略多重随机数【英文标题】:Content Security Policy multiple nonce 【发布时间】:2020-05-01 01:13:18 【问题描述】:

我有一个单页应用程序(内置于 .net core MVC 2.2),其中 html 部分是动态加载的。

在主文档中,添加了动态生成的标头的 CSP 策略如下所示:

Content-Security-Policy: script-src 'self' 'nonce-I64vb811BxRNGV9Xf0pM'

然后是通过 jquery ajax 加载函数加载的页面部分。 page 部分包含一个带有 nonce 的脚本(来自 src)。带有 CSP 标头的页面部分看起来像

Content-Security-Policy: script-src 'self' 'nonce-ci5TQsyidT8x2jwBLRHS'

一切都好,但浏览器(chrome、safari 阻止脚本),带有消息:

jqueryscriptsbundle.js:formatted:43 Refused to execute inline script 
because it violates the following 
Content Security Policy directive: "script-src 'self' 'nonce-I64vb811BxRNGV9Xf0pM'

因此浏览器正在比较脚本的 nonce,即 ci5TQsyidT8x2jwBLRHS 与根/主页 nonce 值 I64vb811BxRNGV9Xf0pM,因此脚本被阻止。

这是正确的行为吗?我该怎么做才能让它发挥作用?

【问题讨论】:

【参考方案1】:

与页面一起加载的初始 CSP 提供了一个随机数。您要做的是在初始页面加载后通过 Ajax 添加另一个随机数。 CSP 明确不允许这样做;这不是错误——这是重点。

您可以做的是允许strict-dynamic 的script-src。这允许您授权脚本,并且该脚本加载的任何内容也被授权。见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src

【讨论】:

明确一点:最好从主页链接脚本而不是加载新脚本。使用严格动态不太安全;但肯定不如 unsafe-inline 糟糕......在 Ajax 函数本身中,您可以在加载后将现有脚本链接到新内容 感谢提醒,将现有脚本链接到新内容是什么意思?你会怎么做? 您知道在页面加载时通常如何将脚本链接到(例如)onclick 事件吗?您也可以将其作为 Ajax 功能的一部分进行 - 添加新内容,然后 然后 将脚本链接到该内容 很难做到。 safari 不支持严格动态。谢谢 确实如此,但我没有让你了解链接部分,充其量我可以在所有 js 中放置一个 Init 方法并根据页面模块调用 init 方法,作为第二种选择,我正在考虑利用 session 为单个 session 保持相同的 nonce。

以上是关于内容安全策略多重随机数的主要内容,如果未能解决你的问题,请参考以下文章

内容安全策略 (csp) 随机数:随机数应该多长时间或多复杂

如何为 HTML 属性设置内容安全策略

Electron建议开发者定义定义内容安全策略

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过