如何从 SVG 文件中删除所有 javascript?

How do you remove all javascript from an SVG file?

我们计划允许用户上传 SVG 文件和图标。问题是 SVG 文件可以包含 JavaScript,因此很容易受到注入攻击。

<svg 
xmlns="http://www.w3.org/2000/svg" 
width="780" height="550" 
onload="(function(){ alert('doing something nasty') })()">

会在使用 svg 文件时执行此代码。

我找到了这个 nice library to manage SVG files。这有助于删除诸如 onEVENT='someJs()' 之类的属性;但这仍然无法帮助我晚上入睡。

那么如何巧妙的把一个JS代码的SVG文件一网打尽呢?

https://digi.ninja/blog/svg_xss.php 详细说明了这一点。

它指出:

  1. 直接查看 - 易受攻击 - 文件直接链接。

  2. 使用 content-disposition 直接查看:附件 - 不易受攻击 - Headers 已发送以强制下载文件。

  3. 使用 CSP 直接查看 - 不易受攻击 - 内容安全策略设置为禁止内联 JavaScript。

  4. 图像标签 - 不易受攻击 - SVG 通过防止脚本的图像标签引用。

  5. 带有 CSP 的标签 - 不易受攻击 - 图像标签和与上述相同的 CSP 以提供双重保护。

  6. 已通过 Inkscape 清理 - 易受攻击 - 这是直接视图,但文件已通过以下命令处理:

    inkscape --file="xss.svg" --verb="FileVacuum" --export-plain-svg="sanitised.svg"
    

(预计这会删除 JavaScript 但它没有。)

  1. iframe 中的图像 - 易受攻击 - SVG 作为 iframe 的源加载,没有设置特殊属性。
  2. 沙盒 iframe 中的图像 - 不易受攻击 - SVG 作为 iframe 的源加载,但沙盒属性设置为 块脚本。