添加内容安全策略会阻止 'local' 托管 JavaScript 和多个站点的其他站点资源

Adding Content Security Policy is blocking 'local' hosted JavaScript and other site resources for multiple sites

在向使用各种 JavaScript 和其他本地资源(例如 jQuery、字体等)的现有站点添加内容安全策略 (CSP) 的过程中

CSP 似乎甚至在阻止和扫描这些破坏正常功能和网站显示方式的资源。

这些不同的资源是站点的同一站点项目解决方案的一部分。

从这样的 CSP 开始:

"default-src https; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self'"

哪个阻止了 jQuery、页面功能、导致布局问题等 于是去了:

"default-src https ; img-src 'self' data:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline' 'report-sample'; connect-src 'self'; base-uri 'self'; form-action 'self';"

在 style-src 和 script-src 上允许 'unsafe-eval' 和 'unsafe-inline' 似乎至少允许 jQuery 和各种资源工作。虽然仍然没有包括允许一些字体和图标资源,如下图所示。1

正如在浏览器的开发工具控制台中所看到的,对于托管在同一本地主机上的各种字体等,指示“已阻止加载资源”,该站点来自 运行。1

到目前为止,这些是我发现对解决这个问题有用的资源:

如何允许加载这些资源? 似乎是“default-src https”部分阻止了它们的加载。

如果添加“localhost:50149”,它们似乎可以正常加载,但当本地 ISS 更改其端口或将相同代码部署到多个托管站点时,这将不起作用。

允许开发站点和多个站点使用相同的设置进行部署。

有没有办法在不直接知道“主机”站点名称的情况下允许来自同一本地主机的资源被允许?

How can those resources be allowed to load? It seems to be the "default-src https" section which is preventing them from loading.

是的,您没有指定 font-src 指令,因此它会回退到 default-src。在您的情况下,default-src https 指令会阻止加载字体,因为:

  • https scheme-source 错误,正确的是https:(带冒号)。
  • 指定https:不会解决问题,因为你通过http:加载字体(http://localhost:50149/Content/fonts/...)

您可以使用 default-src http: https:。这是不安全的,因为允许任何主机源省略回退指令。
您可以使用 default-src 'self'。如果从 localhost:xyz(相同的方案、主机名和端口号)加载页面,'self' 将允许从 localhost:xyz 加载资源。
如果只阻止字体,也可以不使用 default-src,而是将 font-src 'self' 添加到 CSP 中。

If "localhost:50149" gets added they seem to load fine but that doesn't work when the local ISS changes its port or the same code gets deployed to multiple hosted sites.

可以指定 localhost:*。星号 (*) 表示任何端口号。或者如上所述使用'self'