忽略样式属性的内容安全策略随机数

Posted

技术标签:

【中文标题】忽略样式属性的内容安全策略随机数【英文标题】:Content Security Policy nonce on style attribute being ignored 【发布时间】:2021-05-25 04:21:01 【问题描述】:

我正在设置内容安全策略,供应商库(引导程序)正在设置内联样式以显示对话框,Edge/Chromium 表示更改已被拒绝。

我的 CSP 标头(示例拆分为单独的行以便于阅读)是:

default-src 'none'; 
script-src 'self' 'nonce-OGrJRYbkub0OVcGnjoCFDw/OF+bamLQddwgBEfu9HjE='; 
style-src 'self' 'nonce-OGrJRYbkub0OVcGnjoCFDw/OF+bamLQddwgBEfu9HjE='; 
style-src-attr 'self' 'nonce-OGrJRYbkub0OVcGnjoCFDw/OF+bamLQddwgBEfu9HjE='; 
img-src 'self' https://www.gravatar.com;
font-src 'self' 'nonce-OGrJRYbkub0OVcGnjoCFDw/OF+bamLQddwgBEfu9HjE=';
connect-src 'self';
prefetch-src 'self';
form-action 'self';
manifest-src 'self';
upgrade-insecure-requests; block-all-mixed-content; report-to default;

如您所见,我设置了style-src-attr,我的html如下:

<div id="large-right-modal" class="modal fade show" tabindex="1" role="dialog" aria-labelledby="large-right-modal-label" nonce="OGrJRYbkub0OVcGnjoCFDw/OF+bamLQddwgBEfu9HjE=" aria-modal="true">
</div>

当我显示这个引导模式时,库添加了内联样式style="display: block;",浏览器给了我错误:

拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src-attr 'self' 'nonce-OGrJRYbkub0OVcGnjoCFDw/OF+bamLQddwgBEfu9HjE='”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-TH1YO7Owtg52rPfkQs+Us6yN6exn7w99CdIBBm9BmMQ=”)或随机数(“nonce-...”)。

这没什么意义,nonce 和被修改元素上的nonce 是一样的。唯一可行的方法是将unsafe-inline 添加到我试图避免的策略中。

【问题讨论】:

【参考方案1】:

Nonce 可以用在 nonceable 元素中。至少在 CSP 级别 2 中,这主要限于

【讨论】:

我认为这是可以接受的;您可以在标签上定义随机数,否则您将无法处理由 JScript 更改的样式,或者无法在几个特定位置使用内联样式而不使用 catch all 'unsafe-inline' 仅限&lt;script&gt; and &lt;style&gt; are nonceable elements。 JScript 的句柄样式是allowed,除了setAttribute("style", ...) func。顺便说一句,bootstarp 使用 CSP 安全方式添加 style='display:block;' 并根据 sha256-TH1YO7Owtg52rPfkQs+Us6yN6exn7w99CdIBBm9BmMQ= 判断 - 它不是 style='display:block;' 被阻止。 font-src 指令涵盖 @font-face 构造 - 它不是 html 元素,因此无法应用 'nonce-value'style-src-attr 指令不支持 'self''nonce-value'

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

内容安全策略多重随机数

内联样式的 svg 内容安全策略

内容安全策略:忽略 script-src 中的报告样本:指定严格动态

拒绝加载样式表,因为它违反了内容安全策略

拒绝应用内联样式,因为它违反了以下内容安全策略指令

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