正确使用具有内容安全策略(CSP)的哈希

问题描述 投票:0回答:1

我正在尝试将哈希与我的内容安全策略结合使用...

下面是我的控制台中的两个示例错误:

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' apis.google.com cdn.iubenda.com cdnjs.cloudflare.com www.googletagmanager.com". Either the 'unsafe-inline' keyword, a hash ('sha256-oKmCrr+GWRARSXYeVJshOWETr0oqOtt73CNO8efpujQ='), or a nonce ('nonce-...') is required to enable inline execution.

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' apis.google.com cdn.iubenda.com cdnjs.cloudflare.com www.googletagmanager.com". Either the 'unsafe-inline' keyword, a hash ('sha256-pS4Uy3ilo+JLn8IadtJGfyO9z7jqIrGUONfEUDLxoPk='), or a nonce ('nonce-...') is required to enable inline execution.

以下是相应的内容安全策略指令:

add_header Content-Security-Policy "default-src 'self'; script-src 'self' apis.google.com cdn.iubenda.com cdnjs.cloudflare.com www.googletagmanager.com; style-src 'self' fonts.googleapis.com; img-src 'self' cdn.shortpixel.ai secure.gravatar.com; font-src 'self' fonts.googleapis.com fonts.gstatic.com";

特别是在这个例子中:

script-src 'self' apis.google.com cdn.iubenda.com cdnjs.cloudflare.com www.googletagmanager.com;

根据我从阅读关于哈希的 CSP 指南中收集到的信息,我应该能够根据我的控制台将哈希添加到指令中......

生成它的最简单方法是打开开发人员工具控制台,它将在控制台错误消息中输出脚本的预期哈希值。

但是,如果我修改指令以包含哈希(下面的示例),我仍然在控制台中收到相同的错误(显然具有不同的哈希)。

script-src 'self' apis.google.com cdn.iubenda.com cdnjs.cloudflare.com www.googletagmanager.com 'sha256-oKmCrr+GWRARSXYeVJshOWETr0oqOtt73CNO8efpujQ=';

哈希 CSP 指令的正确方法到底是怎样的?为什么同一指令有多个错误,这基本上是针对指定的每个域的一个错误吗?一个哈希值应该涵盖所有指定的域吗?

不太确定我应该怎么做。

content-security-policy
1个回答
0
投票

根据我阅读的内容 content-security-policy.com/hash/ 关于哈希值的 CSP 指南,我应该是 能够根据我的控制台将哈希添加到指令中...

 
是的,它只是在“理论上”起作用,“实践”更困难。是的,Google Chrome 计算哈希值,但您需要仔细阅读错误消息以确定真正被阻止的内容:内联脚本javascript:导航内联事件处理程序。因为每个都有自己的解决方法。
 
- 内联脚本只能由“sha256-VALUE”令牌允许。
 
- 要允许 javascript:导航和内联事件处理程序,您需要将“sha256-VALUE”标记与
'unsafe-hashes'
一起使用。目前,并非所有浏览器都支持 javascript: 导航
'unsafe-hashes'

但是如果我修改我的指令以包含哈希(下面的示例),我 在控制台中仍然出现相同的错误(显然具有不同的哈希值)。

 
你为什么停下来?我看到你使用
www.googletagmanager.com
(GTM),你认为GTM只有一个内联脚本吗?您允许父脚本,它开始加载子脚本,因此您需要两者的哈希值。
 
您可以使用父脚本哈希 +
'strict-dynamic'
令牌来允许所有子脚本,但目前在 Safari 中不起作用。

 
最后,您将获得所有内联脚本的大量哈希值。不好的是 GTM 和其他人可能会不时更改其内联脚本的内容,因此您必须添加新的哈希值并删除过时的哈希值。但你不知道哪个脚本属于哪个哈希。

因此,更好的方法是对任何内联脚本使用

'nonce-value'
,更重要的是,因为 GTM 将“随机数”分配给所有内联脚本(自定义 HTML 标签除外)。对于自定义 HTML 标签(如果使用),您可以使用哈希值,因为这些脚本在您的控制之下。

最好先手动调查所有内联脚本,然后再决定如何更简单、更可靠地允许它们。

PS:GTM 对于 CSP 来说是一个难题,因为 GTM 可用于注入内联/外部脚本的开放列表。如果使用自定义 JavaScript 变量名称用于“自定义 HTML 标记”,则需要允许“unsafe-eval”。
您可以测试您的 GTM ID,了解它加载了哪些附加脚本以及哪个 CSP 足以满足它。

© www.soinside.com 2019 - 2024. All rights reserved.