有没有什么方法可以让用户上传的SVG图像免受代码注入等的影响

Is there any way to make user uploaded SVG images safe from code injection etc?

本文关键字:图像 SVG 代码 影响 注入 方法 什么 用户 有没有      更新时间:2023-09-26

我想在网站上显示用户上传的SVG图像,但它们很容易被利用:

  • https://security.stackexchange.com/questions/11384/exploits-or-other-security-risks-with-svg-upload
  • https://security.stackexchange.com/questions/36447/img-tag-vulnerability

例如,可以在SVG中嵌入任意javascript。性能利用也有问题,但我认为这些问题的优先级较低。

是否有任何机制可以使SVG在某种程度上安全,并仅将其用作图像?我可以简单地信任<img src="/media/user-uploaded-image.svg" />吗?

Wikipedia/Wikmedia Commons托管SVG文件。有人知道他们采取了什么措施来防止SVG漏洞吗?

Wikipedia/Wikmedia Commons托管SVG文件。有人知道他们采取了什么措施来防止SVG漏洞吗?

它们从一个单独的主机名(特别是upload.wikimedia.org)提供上载的文件。你可以随心所欲地将站点脚本跨到那里,但它不会给你带来任何好处:它与en.wikipedia.org生活在不同的起源,无法接触其cookie或与脚本交互。

这最终是处理文件上传的唯一无懈可击的方法,也是大多数大玩家所做的。当你允许任意文件时,很难彻底扫描所有模糊的XSS可能性。

我可以简单地信任<img src="/media/user-uploaded-image.svg" />吗?

<img>做什么其实并不重要——用户只需直接导航到SVG地址,它就会在网站的原始位置执行整个页面的脚本。

如果将SVG嵌入为<image>,它应该无法执行脚本。请参见此处:https://www.w3.org/wiki/SVG_Security

当然,您也可以在处理之前解析文档,并应用与html文件相同的过滤器和正则表达式。

还要注意(据我所知)SVG请求任意外部图像的能力是一种攻击载体。