FlawOpen

flawopen.com/XSS/SVG 上传

上传 SVG 有 XSS 风险吗?

参考页面
简要回答

上传的 SVG 是文档,而不只是像素:它可以包含脚本、事件处理器等活动内容。脚本是否执行取决于浏览器接收它的上下文。通过 <img> 使用时处于受限图像上下文;内联、直接导航或作为文档嵌入时则可能处于活动上下文。

SVG 与其他图像格式的区别

与 PNG 或 JPEG 不同,SVG 是 XML,可以包含活动内容。浏览器会在 <img> 等受限图像上下文中禁用脚本,但直接打开 SVG、通过 <object>、<iframe> 或 <embed> 作为文档嵌入,或将标记内联插入时并非如此。如果应用在自身 origin 下以活动文档上下文提供用户上传的头像,就可能形成存储型 XSS。行为取决于上下文;扩展名和 MIME 类型都不能替代内容清理。

如何安全处理上传文件

常见问题

检查文件扩展名或 MIME 类型就够了吗?

['检查文件扩展名或 MIME 类型就够了吗?', '不够。扩展名和声明的 MIME 是元数据,不会检查文档中的活动内容。应验证实际格式,再应用 SVG 专用允许列表清理;如果不需要 SVG 特性,则转换为栅格图像。']

参考资料

另请参阅 XSS 跨站脚本攻击(CWE-79):原理与各编程语言的防护方法 — flawopen.com Vue v-html 的 XSS 风险 WKWebView loadHTMLString 能安全显示不可信内容吗? 反射型、存储型与 DOM 型 XSS 有何区别? Android addJavascriptInterface 的安全风险 Angular XSS 防护:安全默认行为与绕过 API MIME 嗅探 XSS:Content-Type 与 nosniff