在您的内容安全策略中包含数据方案是否安全?

信息安全 xss 内容安全策略
2021-08-09 16:37:03

我有一个 Cordova 应用程序,可以将一些图像转换为 base64。这违反了 CSP 与此消息:

拒绝加载图像 'data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encod...E%3C%2Fg%...%3C%2Fsvg%3E ' 因为它违反了以下内容安全策略指令:“default-src 'self'”。请注意,'img-src' 没有显式设置,因此 'default-src' 用作后备。

根据这个答案,我可以简单地添加data:到我的 Content-Security-Policy 元数据中,但我非常想知道,这是否安全?data:没有指定来源,因此我担心它不安全。

2个回答
  1. 关于将引用的数据协议列入白名单的说明

    数据:允许将数据:URI 用作内容源。这是不安全的;攻击者还可以注入任意数据:URI。谨慎使用它,绝对不要用于脚本。

这不是特定于图像中数据 URI 风险的部分,而且我还没有看到任何实质性证据表明图像中的数据 URI 可以在任何方面在现代浏览器中执行代码,更不用说 XSS 页面了。

在某些上下文中,SVG 图像可以执行 Javascript 代码,但它们要么是子上下文,例如<iframe><object><embed>元素,要么是宿主 DOM 的直接部分,即<svg>元素。

MDN明确指出<img>嵌入式 SVG不能执行 Javascript,以及其他一些安全限制,说

  • JavaScript 被禁用。
  • 无法加载外部资源(例如图像、样式表),但如果通过 data: URI 内联可以使用它们。
  • :visited-link 不呈现样式。
  • 平台原生小部件样式(基于 OS 主题)已禁用。
  1. data:作为一种可能的缓解措施,似乎不可能将 MIME 指定为协议白名单声明的一部分。我见过的唯一能够限制 MIME 类型的内容安全策略指令是plugin-types,它仅限制<object>and <embed>(请参阅通用 CSP 文档)。

我会同意接受的答案,如果您不必使用data-uris,并且可以轻松地这样做,那么保留您的 CSP 而不使用它们会更容易。但是,如果您完全使用图像,那通常是一个巨大的痛苦。

这是一个很好的问题,我建议您花时间从安全角度考虑这个问题,而不是下意识地从您发送的链接中实施解决方案。

是的,正如您所担心的那样,data:在 CSP 指令中使用 是不安全的,因为这允许将 XSS 漏洞作为数据打开:可以处理任何 URI。这在Mozilla 的 CSP 文档中有详细说明在这个W3C 工作草案中

CSP 中没有办法指定“仅允许通过数据 URI 嵌入 SVG 图像,但不允许任何其他类型的 URI”。CSP 只允许您指定data:.

作为最佳实践,我将努力解决有关以 base64 形式提供的图像的根本问题,并查看是否可以通过其他方式完成,以免需要修改 CSP 指令。