SVG 是否可以以这样的方式构造,即在读取元数据时它会使服务器无响应。并且可以用作对服务器的 DoS 攻击?
元数据是什么意思?如果您追求宽度和高度,则必须至少部分解析 SVG 文件才能获得它;没有像许多位图格式那样从标头中读取几个字节的捷径。这带来了 XML 解析的常见风险,例如:
- 针对远程文件、本地网络敏感资源、本地机器敏感文件和设备文件的外部实体/DTD 子集包含攻击
- 嵌套实体扩展炸弹
- 病态嵌套标签结构可能会达到递归资源限制
作为标准预防措施,您将禁用所有 DTD 处理、XInclude、XSL、XSI 和实体解析。
是否可以以这样的方式构造 SVG,即在客户端上呈现 SVG 时,客户端变得无响应并可能使我网站上的每个用户浏览器崩溃?
可能,但是位图格式也可能发生这种情况。参见例如不久前损坏的 PNG 文件漏洞。
SVG 文件更令人担忧的是它们可以包含 JavaScript,它将在托管站点的安全上下文中运行,因此您需要担心跨站点脚本。
实际上,所有类型的上传文件都容易受到此攻击,尽管不是以这种直接、易于利用的方式。在某些情况下,浏览器(尤其是 IE)会对它们进行内容嗅探,如果它们看到看起来像标签的东西,它们可能会将它们重新解释为 HTML,包括 JavaScript。此外,将上传的文件视为 Java 小程序和 Flash 策略文件也存在一些附带问题。
所有这些问题的标准缓解措施是为您的不受信任的资源提供服务,无论是位图、SVG 还是其他任何东西,从不同的域到您的主站点:一个没有敏感会话 (cookie/auth) 信息且没有能力的域将脚本写入您的主站点的域。
另外,为缩略图生成一个小的(200x200px)PNG是一种好习惯,还是用缩放因子或其他东西来操纵SVG本身更好?
那将是一个不错的选择,但是您必须拖入一些依赖项才能渲染为位图,例如,如果您使用的是 Java,则为 Batik。自然地引入新的复杂库会增加攻击面;将缩略图作为单独的低权限帐户低优先级守护程序任务运行可能是个好主意。