在我的站点中实施了 CSP,但第 3 方库使用内联 javascript。我可以选择性地允许 'unsafe-inline' 吗?

Implemented CSP in my site, but a 3rd party library uses inline javascript. Can I selectively allow 'unsafe-inline'?

为了安全起见,我在我的 public 站点中实施了 CSP headers,并且重构了代码以删除任何内联 javascript 实例,例如 onclick=foo()<a href='javascript: bar()'.

我们最近与将代码注入页面的第 3 方集成。这在每个 public 对开页上都是必需的。问题是他们的代码包含大量内联 javascript(与上面提到的相同)并且违反了我们禁止内联脚本的 CSP headers。

我的理解是,如果您必须为脚本添加 'unsafe-inline',由于仍然存在安全风险,您还不如根本不实施 CSP。

我们可以更改每页的 CSP headers,但由于每个页面都需要代码,因此似乎全有或全无。

您似乎不能只允许 'unsafe-inline' 用于页面的特定部分,或者我们可以只允许它用于该部分。

是我唯一的选择,让'unsafe-inline'打败整个CSP点吗?

Is my only choice to allow 'unsafe-inline' and defeat the whole point of CSP?

很有可能,是的。对不起。但是可能有办法绕过它。

如果您确切知道第三方脚本将向您的网站注入什么代码,您可以通过哈希将该代码列入您的 CSP 中的白名单。例如,如果您知道将注入以下脚本:

<script>alert("hello world");</script>

你可以计算

> Base64(SHA256('alert("hello world");'))
"1tD3lYbOBFeMLrXs+T9Tv9xEgcMsVs032rlMyrYSa0c="

并将以下内容添加到您的 CSP:

script-src 'sha256-1tD3lYbOBFeMLrXs+T9Tv9xEgcMsVs032rlMyrYSa0c='

当然,如果涉及多个内联脚本,这将极大地膨胀您的策略的大小,并且除非这些脚本的内容是 绝对,否则它根本不起作用持续的。因此,这是否可行将在很大程度上取决于您的应用程序,以及您试图保持兼容性的脚本。 (它甚至可能随着供应商更新该脚本而改变……)

您可以使用随机数方法来使用 nonce method to easily achieve this, without any need for unsafe-inline. For example, Google has a guide on how to integrate Tag Manager,这听起来像是您的 use-case 的一个例子。

简而言之,使用这种方法,服务器生成一个single-use不可预知的令牌并设置一个CSP允许它,然后将相同的令牌用于内联脚本。这样,服务器就可以准确地确定哪些内联脚本是可接受的。