有没有办法设置 Content-Security-Policy header 说不要 运行 javascript 来自任何具有主机名的 URL

Is there a way to set a Content-Security-Policy header to say don't run javascript from any URL that has a hostname

我们的 Web 应用程序提供 javascript 个文件的页面和其他内容。我们正在通过安全扫描器,它推荐了 Content-Security-Policy header,这不是一件坏事。但是有一个丑陋的皱纹。我们通过“/js/...”链接为所有 javascript 提供服务,并且位于 reverse-proxy 服务器之后,可以通过多个路径加载。所有这些的结果是我们实际上并不知道服务器端我们自己的 URL。

所以只有当我可以说不允许主机名时,我才能放置 header。

如果我真的需要一个主机名,我可能会这样做,但我知道这是禁止的。

<HEAD>
<SCRIPT>
document.write('<META HTTP-EQUIV="Content-Security-Policy" ...>');
</SCRIPT>
<SCRIPT SRC="/js/public/require.js"></SCRIPT>
...

有几个地方我们从外部路径获取数据(不是 javascript);我想我只需要手动将 URL 添加到这些页面的列表中即可。

The consequence of all that is we don't actually know our own URL on the server side.

选项 1. URL 表示:

[scheme://] [host] [:port] [/path]

即使您使用像 <SCRIPT SRC="/js/public/require.js"></SCRIPT> 这样的相对 URL,浏览器也会遵循同源策略并使用来自父 window.
[scheme://] [host] [:port] 因此,您无论如何都有一个 host (域名)。即使你使用 IP 地址作为 host,这个 IP 变成了一个主机名(但是你失去了 https: 的能力)。
真正的 host 始终存在,并且知道服务器上的 path 对于 CSP 不是强制性的。

因此您可以使用 script-src 'self' 来表示自己的主机名,网络应用程序通过该主机名运行。或者,如果您希望仅允许来自 /js/ 文件夹的脚本,您可以使用 script-src your_domain.com 甚至 script-src your_domain.com/js/

选项 2. 使用 'nonce-value':

使用 script-src 'nonce-base64value'; 发布 CSP 并使用 base64value 作为脚本中的 nonce= 属性值:

<SCRIPT SRC="/js/public/require.js" nonce="base64value"></SCRIPT>

<SCRIPT nonce="base64value">alert('Hello');</SCRIPT>