首页 > 解决方案 > 有没有办法设置 Content-Security-Policy 标头来表示不要从任何具有主机名的 URL 运行 javascript

问题描述

我们的 Web 应用程序提供页面和 javascript 文件页面等等。我们正在通过一个安全扫描器,它推荐了一个 Content-Security-Policy 标头,这不是一件坏事。但是有一个难看的皱纹。我们通过'/js/...'链接提供我们所有的javascript,并且位于反向代理服务器后面,可以通过多个路径加载。所有这一切的结果是我们实际上并不知道服务器端我们自己的 URL。

因此,只有当我可以说不允许主机名时,我才能放置标题。

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

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

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

标签: http-headerscontent-security-policy

解决方案


所有这一切的结果是我们实际上并不知道服务器端我们自己的 URL。

选项 1. URL 表示:

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

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

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

选项 2。使用'nonce-value'

发布 CSPscript-src 'nonce-base64value';并将 base64value 用作脚本中的nonce=属性值:

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

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


推荐阅读