在我的站点中实施了 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允许它,然后将相同的令牌用于内联脚本。这样,服务器就可以准确地确定哪些内联脚本是可接受的。
为了安全起见,我在我的 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允许它,然后将相同的令牌用于内联脚本。这样,服务器就可以准确地确定哪些内联脚本是可接受的。