在没有 'unsafe-eval' 的情况下允许内容安全策略中的 SVG

Allow SVGs in Content Security Policy without 'unsafe-eval'

SVG 是网络的重要组成部分。有没有办法让在 Inkscape 中创建的 SVG 使用内容安全策略的安全设置header?

我的 SVG 中有多个 "http://..." 链接,这些链接显然是必需的,但更改后 SVG 不再正确显示 "https"。

这些是我的 SVG 中的一些链接:

xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
rdf:resource="http://purl.org/dc/dcmitype/StillImage"

我考虑过用我自己提供的链接和 return 原始链接资源的副本替换这些链接,但我认为这不是这些链接的重点。是吗?

有没有办法修改此类 SVG 以完全删除链接?

您列出的 "links" 只是一个非常特殊的链接。它们是 namespace 声明,用于标识某个元素或属性属于哪个 XML 方言。

是的,这些链接中的地址是存在的。 但它们永远不会被调用。 只有 "validating XML interpreters" 会这样做,浏览器不在其中。浏览器仅将这些 "links" 作为唯一字符串。如果他们知道这些字符串,他们将根据它们所代表的方言呈现内容。如果不是,element/attribute 将被输入到 DOM,但在实际呈现时会被忽略 - 就像浏览器不知道的自定义元素一样。

浏览器可以理解 Inkscape 提供的 SVG 文件中的两个命名空间:

  • xmlns="http://www.w3.org/2000/svg"
  • xmlns:xlink="http://www.w3.org/1999/xlink"

他们告诉浏览器独立文件是 SVG。它们 必须 包括在内(是的,这对于 xlink 来说有点简化),但与 CSP 完全没有关系。

我发现我的问题其实性质不同,我问错了问题。我的问题与 SVG 中的 style="fill:..." 有关,这导致浏览器中的 SVG 呈现完全黑色。这显然是 known bug in Firefox and there is a seemingly good workaround (that also addresses additional security threats) 通过为 SVG 资源设置单独的 CSP headers。