内容安全策略阻止远程 CSS 背景图片

Content security policy blocking remote CSS background image

从远程服务器加载的背景图像被我的 CSP 阻止并显示消息

Content Security Policy: The page's settings blocked the loading of a resource at self ("default-src * https://xxxxx.com"). Source: background-image: url('https://xxxxx....

这是我的 CSP:

<meta http-equiv="Content-Security-Policy" content="default-src * https://xxxxx.com; script-src * 'unsafe-eval' 'unsafe-inline'; img-src 'self' data:">

...其中 xxxxx 显然是我的域。

我认为它不喜欢 url(...,但是 CSP spec 似乎不认为 url() 是一个方案,所以我不知道该怎么做。有人知道吗?

[更新]

根据@sideshowbarker 的评论,我应该指出这个调用来自内联 style 属性(不是标签)。

该 CSP 违规消息表明您有内联 CSS 样式的内容,因此您必须将 CSS 内容移动到单独的文件(并使用 link 元素来引用它) 否则您必须指定 'unsafe-inline'——例如,通过向策略添加 style-src 指令:

<meta http-equiv="Content-Security-Policy"
  content="default-src * https://xxxxx.com;
  script-src * 'unsafe-eval' 'unsafe-inline';
  style-src 'self' 'unsafe-inline';
  img-src 'self' https://xxxxx.com data:">

原因是,问题中引用的 CSP 违规消息并不是说 CSS 样式内容中的图像是问题所在——它只是说您有一些内联样式内容,句号。

而且对于CSP而言,内联样式内容是什么并不重要——只是你现有的CSP政策不允许任何内联样式内容;您现有的政策只允许内联脚本,因为 script-src 是您为 'unsafe-inline' 指定的唯一指令。

因此,如果您要保留该内联样式内容,则必须使用 'unsafe-inline' 来允许它。

更新: 根据下面的评论,似乎在这种情况下为 style-src 添加了 'unsafe-inline' 后,还需要添加 https://xxxxx.com 对于 img-src.


尽管如此,一旦您最终为样式内容和脚本指定了 'unsafe-inline',您似乎就需要开始考虑是否要指定完全没有 CSP 政策——因为允许一切内联都违背了拥有 CSP 政策的初衷。

如果您的目标是降低 XSS 风险,您似乎应该考虑将所有内联 style/script 内容移动到单独的文件中,并使用 <script src>link 来引用这些文件…