内容安全政策

如果您不熟悉内容安全政策 (CSP),不妨从内容安全政策简介开始。该文档涵盖了 CSP 更广泛的网络平台视图;Chrome 应用 CSP 则不那么灵活。

CSP 是一项旨在缓解跨站脚本问题的政策,而我们都知道跨站脚本攻击是一件坏事。我们不会尝试让您相信 CSP 是一种含糊不清的新政策。 这涉及到工作;你需要学习如何通过不同的方式完成基本任务。

本文档旨在向您准确说明适用于 Chrome 应用的 CSP 政策、您需要执行哪些操作来遵守该政策,以及您如何才能以符合 CSP 的方式执行这些基本任务。

Chrome 应用的 CSP?

Chrome 应用的内容安全政策限制您执行以下操作:

  • 您无法在 Chrome 应用页面中使用内嵌脚本。此限制禁止 <script> 代码块和事件处理脚本 (<button onclick="...">)。
  • 您无法在任何应用文件中引用任何外部资源(视频和音频资源除外)。您不能在 iframe 中嵌入外部资源。
  • 不能使用 eval()new Function() 等字符串到 JavaScript 的方法。

这是通过以下政策值实现的:

default-src 'self';
connect-src * data: blob: filesystem:;
style-src 'self' data: 'unsafe-inline';
img-src 'self' data:;
frame-src 'self' data:;
font-src 'self' data:;
media-src * data: blob: filesystem:;

Chrome 应用只能引用应用内的脚本和对象,但媒体文件除外(应用可以引用软件包之外的视频和音频)。Chrome 扩展程序可让您放宽默认的内容安全政策,而不能

如何遵守 CSP

所有 JavaScript 和所有资源都应是本地资源(所有内容都封装在 Chrome 应用中)。

“那我怎么...”

您很可能正在使用模板库,而其中许多模板库与 CSP 不兼容。您可能还需要访问应用中的外部资源(外来图片、网站中的内容)。

使用模板库

使用提供预编译模板的库,一切就绪。您仍然可以使用不提供预编译的库,但这需要您执行一些工作并且存在限制。

您需要使用沙盒隔离您要对其执行“评估”操作的所有内容。 沙盒技术会在您指定的内容上提升 CSP。如果您想在 Chrome 应用中使用非常强大的 Chrome API,沙盒化内容将无法直接与这些 API 交互(请参阅沙盒本地内容)。

访问远程资源

您可以通过 XMLHttpRequest 提取远程资源,并通过 blob:data:filesystem: 网址提供它们(请参阅引用外部资源)。

视频和音频可以从远程服务加载,因为它们在离线或连接不稳定时具有良好的回退行为。

嵌入 Web 内容

除了使用 iframe,您还可以使用 WebView 代码调用外部网址(请参阅嵌入外部网页)。