返回
创建于
状态公开

1. 不会出现问题的情况

  • <img src="evil.svg"> 浏览器只把 SVG 当作图像渲染,不会执行内部 <script> 或事件属性。
  • 作为 CSS background-image: url(evil.svg) 同样只是图像资源,不会触发脚本。

2. 可能出现问题的情况

🔹 内联 SVG

html
1<svg>
2  <script>alert('XSS');</script>
3</svg>
  • 因为这段代码直接在 HTML 里,浏览器会执行里面的 <script>
  • 或者 <circle onload="alert(1)"> 这样的事件属性也会执行。

🔹 使用 object / iframe / embed 引入

html
1<object type="image/svg+xml" data="evil.svg"></object>
2<iframe src="evil.svg"></iframe>
3<embed src="evil.svg"></embed>
  • 这种方式浏览器会把 SVG 当成独立文档解析,其中的脚本是可以运行的。
  • 如果 SVG 文件里写了 alert(1),就会真的弹出来。

🔹 服务器 MIME 类型配置错误

  • 如果 返回头是 Content-Type: text/html 而不是 image/svg+xml, 浏览器可能会把 SVG 当作 HTML 来解析,脚本自然会执行。
  • 这在一些上传/下载场景里比较危险。

🔹 SVG 内部外链(攻击链)

  • SVG 可以内嵌 <image xlink:href="javascript:alert(1)"><a xlink:href="javascript:...">
  • 在某些老旧浏览器或不严格过滤时可能被利用。

3. 实际风险点总结

  • 安全<img>background-image
  • ⚠️ 有风险<svg>(内联)、<iframe><object><embed>
  • ⚠️ 有风险:MIME 类型错误(把 SVG 当 HTML)
  • ⚠️ 有风险:SVG 内部引用 javascript: 或事件属性