内容安全策略:来自 Inkscape 的 SVG,嵌入标签中带有 Sozi 动画
Content Security Policy: SVG from Inkscape with Sozi animation in embed tag
在我的网站上,我在嵌入标签中使用 Sozi 创建了一个动画 SVG 作为 header 图片。
我的 .htacess 文件 CSP header 如下所示:
Header 设置 Content-Security-Policy "default-src 'self'"
显然,这还不够。
Chrome 帮助我为 SVG 中的所有元素提供了大约 50 个不同的哈希和,有点像这样
“拒绝应用内联样式,因为它违反了以下内容安全策略指令:"default-src 'self'"。'unsafe-inline' 关键字、散列 ('sha256-OXKUzBwllYUKQyK1cDvFciYCgedWl0Tn33OfzW6sO0U=') 或随机数 ( 'nonce-...') 是启用内联执行所必需的。另请注意,'style-src' 未明确设置,因此 'default-src' 用作后备。“
有没有办法将整个 SVG 文件列入白名单,而不是将其中具有内联样式的每个元素列入白名单?对我来说,必须 copy-paste 所有这些哈希总和是没有意义的,因为这可以以某种方式对整个事情进行总结。
我已经尝试对 SVG 进行哈希处理,并将其插入 header 的 style-src 部分,但不幸的是,这没有用。使用 'unsafe-inline' 有效(对于 style-src),但如果可能的话,这不是我想要使用的。
转换 Inkscape 的内联样式(正如我现在找不到的地方所建议的那样)是另一种选择,但这也不是我要问的。
无法将整个 SVG 内容列入白名单。如果您保留内联样式并想要一个安全策略,那么该策略必须指定浏览器显示的所有哈希值,否则您必须使用随机数。
否则浏览器无法“概括整个事情”。由于在这种情况下使用 CSP 的目的是确保浏览器可以区分您自己有意添加到文档中的内联样式与您没有添加的样式(因此可能是由攻击者添加的),那么您无需指定每个内联样式实例的哈希值或随机数,否则浏览器无法确定哪个是哪个。
对于 SVG,您在样式属性中使用的所有内容也可以表示为一个属性。
这与您不太相关,因为您正在使用工具来生成 SVG,但对于任何手动编辑它们的人来说。如果您在 <rect style="fill: red" />
之类的问题上遇到错误,您可以通过执行 <rect fill="red">
来更正错误,这是 CSP 在严格规则下有效并且将呈现相同的内容。对所有样式属性执行此操作,您可以让 SVG 在最严格的 CSP 规则集下工作。
在我的网站上,我在嵌入标签中使用 Sozi 创建了一个动画 SVG 作为 header 图片。
我的 .htacess 文件 CSP header 如下所示: Header 设置 Content-Security-Policy "default-src 'self'"
显然,这还不够。
Chrome 帮助我为 SVG 中的所有元素提供了大约 50 个不同的哈希和,有点像这样
“拒绝应用内联样式,因为它违反了以下内容安全策略指令:"default-src 'self'"。'unsafe-inline' 关键字、散列 ('sha256-OXKUzBwllYUKQyK1cDvFciYCgedWl0Tn33OfzW6sO0U=') 或随机数 ( 'nonce-...') 是启用内联执行所必需的。另请注意,'style-src' 未明确设置,因此 'default-src' 用作后备。“
有没有办法将整个 SVG 文件列入白名单,而不是将其中具有内联样式的每个元素列入白名单?对我来说,必须 copy-paste 所有这些哈希总和是没有意义的,因为这可以以某种方式对整个事情进行总结。
我已经尝试对 SVG 进行哈希处理,并将其插入 header 的 style-src 部分,但不幸的是,这没有用。使用 'unsafe-inline' 有效(对于 style-src),但如果可能的话,这不是我想要使用的。
转换 Inkscape 的内联样式(正如我现在找不到的地方所建议的那样)是另一种选择,但这也不是我要问的。
无法将整个 SVG 内容列入白名单。如果您保留内联样式并想要一个安全策略,那么该策略必须指定浏览器显示的所有哈希值,否则您必须使用随机数。
否则浏览器无法“概括整个事情”。由于在这种情况下使用 CSP 的目的是确保浏览器可以区分您自己有意添加到文档中的内联样式与您没有添加的样式(因此可能是由攻击者添加的),那么您无需指定每个内联样式实例的哈希值或随机数,否则浏览器无法确定哪个是哪个。
对于 SVG,您在样式属性中使用的所有内容也可以表示为一个属性。
这与您不太相关,因为您正在使用工具来生成 SVG,但对于任何手动编辑它们的人来说。如果您在 <rect style="fill: red" />
之类的问题上遇到错误,您可以通过执行 <rect fill="red">
来更正错误,这是 CSP 在严格规则下有效并且将呈现相同的内容。对所有样式属性执行此操作,您可以让 SVG 在最严格的 CSP 规则集下工作。