内容安全策略多重随机数
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) 随机数:随机数应该多长时间或多复杂
Security ❀ CSP Bypass 内容安全策略绕过