flawopen.com/XSS/SVG 上传
上传 SVG 有 XSS 风险吗?
参考页面
简要回答
上传的 SVG 是文档,而不只是像素:它可以包含脚本、事件处理器等活动内容。脚本是否执行取决于浏览器接收它的上下文。通过 <img> 使用时处于受限图像上下文;内联、直接导航或作为文档嵌入时则可能处于活动上下文。
SVG 与其他图像格式的区别
与 PNG 或 JPEG 不同,SVG 是 XML,可以包含活动内容。浏览器会在 <img> 等受限图像上下文中禁用脚本,但直接打开 SVG、通过 <object>、<iframe> 或 <embed> 作为文档嵌入,或将标记内联插入时并非如此。如果应用在自身 origin 下以活动文档上下文提供用户上传的头像,就可能形成存储型 XSS。行为取决于上下文;扩展名和 MIME 类型都不能替代内容清理。
如何安全处理上传文件
- ✓存储或展示前,使用维护中的 SVG 专用清理器和明确的允许列表。除非产品需要,否则移除可执行元素、事件处理器、外部引用和
foreignObject;不要用正则表达式清理 XML。 - ✓如果用户只需要图像,就在隔离且受资源限制的进程中将 SVG 栅格化并提供栅格结果。不需要时将原文件存放在 web 根目录之外。
- ✓从独立的可注册域名提供用户上传内容,该域名不接收应用 Cookie。仅使用兄弟子域仍可能收到为父域设置的 Cookie。
- ✓若必须保留不可信 SVG 文档,则通过响应头强制下载,设置 Content-Disposition: attachment 和
X-Content-Type-Options: nosniff;或仅在 <img> 等受限图像上下文中显示。避免内联、<object>、<iframe> 和同源文档方式提供。
常见问题
检查文件扩展名或 MIME 类型就够了吗?
['检查文件扩展名或 MIME 类型就够了吗?', '不够。扩展名和声明的 MIME 是元数据,不会检查文档中的活动内容。应验证实际格式,再应用 SVG 专用允许列表清理;如果不需要 SVG 特性,则转换为栅格图像。']