domparser可判断svg是否为合法xml:用"image/svg+xml"类型解析,若documentelement为null或nodename为"parsererror",说明xml结构非法。

直接用 DOMParser 判断 SVG 是否能被解析成合法 XML
浏览器对 SVG 的处理本质是 XML 解析,不是图形渲染。只要 DOMParser 能成功 parse,就说明它在语法层面“看起来像 SVG”——哪怕内容恶意,也会进入 DOM 流程,后续可能触发脚本或事件。这是检测的第一道门槛。
实操建议:
- 用
new DOMParser().parseFromString(svgStr, "image/svg+xml")尝试解析字符串;若返回null或documentElement.nodeName === "parsererror",说明基础 XML 结构非法(比如标签未闭合、属性没引号),这种 SVG 通常无法被浏览器执行 - 注意 MIME 类型必须写
"image/svg+xml",写成"text/html"或"application/xml"会导致行为不一致,尤其在旧版 Edge 或 Safari 中 - 这个步骤只能筛掉硬伤,不能识别
<script></script>或onload——它们在 XML 层面完全合法
检查 SVG 字符串是否含高危标签和属性
SVG 支持的脚本能力远超普通图片格式,<script></script>、<foreignobject></foreignobject>、on\w+=、xlink:href="javascript: 都是明确的 XSS/XXE 信号。仅靠文件后缀或 Content-Type 检查毫无意义。
实操建议:
- 用正则粗筛(非最终防御):
/;匹配即告警 - 更稳妥的是遍历解析后的 DOM:对
documentElement.querySelectorAll("*")的每个节点,检查node.hasAttribute("onload")、node.tagName === "SCRIPT"、node.getAttribute("xlink:href")?.startsWith("javascript:") - 特别注意
块,它可绕过简单字符串过滤,但 DOM 解析后仍保留在文本节点中,需递归检查textContent
模拟真实加载上下文判断是否执行 JS
<img src="x.svg"> 和 <object data="x.svg"></object> 对 SVG 的处理天差地别:<img> 完全隔离脚本,<object></object> 或内联 <svg></svg> 则允许 onload 执行。漏洞是否存在,取决于你实际怎么用它。
实操建议:
- 若服务端返回 SVG 给前端用
<img>加载,只需确保响应头为Content-Type: image/svg+xml,且不拼接进 HTML;此时即使 SVG 含onload,也不会触发 - 若前端用
innerHTML = svgString或document.write()插入,等同于开放 XSS 入口;必须先净化,不能只删<script></script>标签——<svg onload="alert(1)"></svg>同样有效 - 测试时可用临时 iframe:
const iframe = document.createElement("iframe"); iframe.srcdoc = svgStr; document.body.appendChild(iframe);,观察控制台是否有执行痕迹
上传场景下必须验证服务器端解析行为
用户上传的 SVG 文件,常被后端用 libxml、lxml 或 javax.xml.parsers 解析——这些库默认启用外部实体(XXE),而 SVG 的 可定义 <code>,导致读取敏感文件。
实操建议:
- 上传一个最小化 XXE payload:
<?xml version="1.0"?> ]><svg xmlns="http://www.w3.org/2000/svg"><text>&x;</text></svg> - 观察响应体是否包含
/etc/hostname内容;若返回空或报错,再试http://your-server/看是否发起回连(SSRF) - 关键点:服务端是否调用
libxml_disable_entity_loader(true)(PHP)、etree.XMLParser(resolve_entities=False)(Python lxml)等禁用实体加载的配置
<script></script>,而是那些看似无害的 onload 属性和 <foreignobject></foreignobject> 嵌套,它们在 XML 层面完全合规,却在渲染时获得完整 JS 执行权限。检测必须覆盖“能否解析”“含不含危险结构”“怎么加载”“服务器怎么解析”这四层,漏掉任何一层都可能让漏洞溜过去。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











