Skip to content

验证 SVG

本文是 SVG 清理文章 的一部分。

SVG 可能包含许多潜在危险的内容:脚本和外部资源。

样式

全局 <style> 和内联 style 会被转换为属性。

样式会使分析图标结构的过程变得复杂,而该结构是后续移除未使用元素和解析调色板所必需的,因此应当移除样式。如果样式过于复杂无法解析,或样式覆盖了属性,则会抛出异常。

非法标签

清理 过程中,还会检查图标是否包含不良内容。

验证非常严格且遵循特定规范。

导致验证失败的情况(函数将抛出异常):

  • 发现 <script> 或事件监听器。
  • 文本或字体。见下文。
  • 任何外部资源。
  • 光栅图像。见下文。
  • 链接。
svg<svg viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">
 <script>
 // <![CDATA[
 window.addEventListener('DOMContentLoaded', () => {
     alert('Bad stuff!!!');
 })
 // ]]>
 
</script>

 <circle cx="5" cy="5" r="4" />
</svg>
svg<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
   <image href="https://example.com/totally-not-a-tracker.png" height="200" width="200"/>
</svg>

被移除的标签

清理函数包含所有允许的 SVG 标签及其属性的列表。

如果遇到未知标签,将按以下方式处理:

  • 如果标签属于某个命名空间(例如 <rdf:RDF>),它及其所有子元素将被移除。
  • 如果标签没有命名空间,则会抛出异常。

属性

清理函数还会检查每个元素上的每个属性。

所有不影响图标渲染的属性都会被移除。

如果发现事件监听器,函数将抛出异常。

允许使用 class 属性。

内联 style 会被转换为属性(在解析其他属性之前)。

文本和字体

不允许使用任何文本标签。

为什么?因为不同操作系统使用不同的字体,这会导致图标渲染效果不一致。

此规则无法禁用。

svg<svg viewBox="0 0 240 80" xmlns="http://www.w3.org/2000/svg">
 <style>
   .small { font: italic 13px sans-serif; }
   .heavy { font: bold 30px sans-serif; }

   /* Note that the color of the text is set with the    *
    * fill property, the color property is for HTML only */

   .Rrrrr { font: italic 40px serif; fill: red; }
 
</style>

 <text x="20" y="35" class="small">My</text>
 <text x="40" y="35" class="heavy">cat</text>
 <text x="55" y="55" class="small">is</text>
 <text x="65" y="55" class="Rrrrr">Grumpy!</text>
</svg>

光栅图像

有时图标会出于各种目的使用光栅图像,通常用于遮罩或被遮罩的内容。

它们是不被允许的。为什么?

  • 它们无法无损缩放,因此不再是矢量图标。
  • 验证它们会增加不必要的复杂性。在 SVG 中包含无法完全验证的内容是不可接受的。

清理

验证是在 清理过程 中完成的。

这是通过 Iconify Tools 中的 cleanupSVG() 函数完成的。