Show Menu
主题×

内容安全策略 (CSP)

内容安全策略 (CSP) 的主要目标是防止跨站点脚本攻击 (XSS)。这种攻击是指浏览器受到欺骗,运行似乎来自可靠来源但实际上来自其他来源的恶意内容。CSP 允许浏览器(代表用户)验证脚本是否实际来自可靠来源。
通过将 Content-Security-Policy HTTP 标头添加到服务器响应,可实施 CSP。有关 CSP 的更多信息,请访问 Mozilla 开发人员网络网站: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP

需要克服的问题

标签管理系统旨在用于动态加载脚本。CSP 旨在阻止那些动态加载的脚本,因为它们可能会引发安全问题。
如果您希望 Launch 与 CSP 配合使用,则需要克服两个主要挑战:
  • Launch 库的来源必须可靠。 ​如果不满足这项条件,则浏览器将阻止 Launch 库和其他必需的 JavaScript 文件,并且不会在页面上加载。
  • 必须允许使用内联脚本。 ​如果不满足这项条件,则页面将阻止“自定义代码”规则操作,并且无法正常执行。
如果要使用 Launch ​实施 CSP,则您必须解决这两个问题,而又不能将其他脚本错误地标记为安全。提高安全性的代价是增加了您自身的工作量。

可靠来源

如果您自行托管库,则库的来源可能是您自己的域。您可以指定主机域的安全源,如下所示:
script-src 'self'
如果由 Adobe 托管库(使用 Managed by Adobe 主机),那么您的库会保留在 assets.adobedtm.com 中。这种情况下,您的策略看起来会是这样的:
script-src 'self' assets.adobedtm.com
您应该指定 self 作为安全域,以便不会破坏已经加载的脚本,但同时您还需要将 assets.adobedtm.com 列为安全,否则您的 Launch 库将不会加载到页面上。
您可以在 Mozilla 开发人员网络网站 上阅读有关可信来源的更多信息。

内联脚本

内联脚本给 CSP 带来了挑战,因为默认情况下不允许使用内联脚本。要允许使用内联脚本,您有两种选项:
  • 允许使用所有内联脚本(最不安全)
  • 允许特定场合使用(安全性良好)
CSP 规范详细介绍了第 3 种选项,即,使用哈希。但是,这种方法因各种各样的原因,不适用于任何类型的 TMS,其中一些原因非常复杂。

安全性良好 - 特定场合

此方法包括生成一个 nonce 并将其添加到 CSP 和每个内联脚本中。当浏览器收到指令要加载带有 nonce 的内联脚本时,会将 nonce 值与 CSP 标头内的值进行比较。如果二者匹配,则会加载脚本。
在每次加载新页面时,这个 nonce 值会发生更改。
有一个非常重要的先决条件:必须 异步 加载 Launch 库。同步加载 Launch 库行不通(因为会导致控制台错误和规则无法正确执行)。
您可以将 nonce 添加到上述 Adobe 托管的 CSP 示例,如下所示:
script-src 'self' assets.adobedtm.com 'nonce-2726c7f26c'
然后,您必须告知 Launch 要去哪里查找 nonce。Launch 在加载内联脚本时会用到这个 nonce。要让 Launch 在加载脚本时使用 nonce,您必须:
  1. 创建引用 nonce(无论您将其放在数据层中的哪个位置)的数据元素。
  2. 配置核心扩展,并指定要使用的数据元素。
  3. 发布数据元素和核心扩展更改。
补充说明:这仅处理自定义代码的加载,它不处理您在自定义代码中的操作。您可以编写与 CSP 不兼容的自定义代码,在这种情况下,CSP 具有优先权。例如,如果您使用自定义代码,通过将代码附加到 DOM 来加载内联脚本,那么 Launch 将无法找到或正确添加该 nonce,进而导致特定自定义代码操作无法按预期发挥作用。

低安全性 - 允许使用内联

如果上述选项不适合您,则您可以告知 CSP 允许使用所有内联脚本。这是最不安全的选项,但它却相对更加易于实施和维护。
同样,假定由 Adobe 管理您的托管文件,并且您将 assets.adobedtm.com 域标记为可靠来源,则 CSP 看起来会是这样的:
script-src 'self' assets.adobedtm.com 'unsafe-inline'
有关允许内联脚本的更多信息,请参阅 MDN 网站上的 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy/script-src