<object> 元素 运行 在哪个沙盒中?这个沙箱可以配置吗?

What sandbox does an <object> element run in? Can this sandbox be configured?

我 运行 一个显示用户生成的 SVG 的站点。它们不受信任,因此需要对其进行沙盒处理。

我目前使用 <object> 元素嵌入这些 SVG。 (与 <img> 不同,这允许加载外部字体。与使用 <iframe> 不同,<object> 调整大小以适应 SVG 的内容大小。See this discussion.

但是,我不知道这些 SVG 在使用 <object> 时是否被适当地沙盒化了。 <iframe> 权限模型相当清晰,例如<iframe sandbox="allow-scripts"> 禁止除 运行ning 脚本之外的所有内容。但是 <object> 元素的 sandbox/permission 模型是什么?

查看 html 规范,似乎无法设置沙盒属性。

HTML Specifications

下面是一些如何使用 object 的例子。

Examples

根据 Mozilla 的说法,whatwg 的邮件列表上曾讨论过添加沙箱属性对象。

Reference to discussion mention

据此看来,iframe 标记自 2008 年 5 月以来就已存在。从那天起我一直在浏览邮件列表,但我还没有找到关于对象沙盒的讨论。

iframe added discussion

这是已存档的邮件列表。

whatwg mailing list archive

我认为您应该考虑在此处与 WhatWG 聊天以获取更多信息。

WhatWG Chat

When I embed a page using <object>, what can that page do by default? E.g. what cookies can it access? Is it the same as an <iframe> without the sandbox attribute?

是的(至少在某些浏览器中是这样)。该对象可以访问与包含它的来源相同的 cookie(但不能访问包含它的来源)。

您可以使用 svg 文件对此进行测试:

<svg xmlns="http://www.w3.org/2000/svg" width="400" height="110">
  <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
  <script>alert(document.cookie)</script>
</svg>

您可以包括:

<script>document.cookie="test=test";</script>
<object data=./x.svg></object>

这在 firefox 中有效(但在 Chrome 中无效,它显然会阻止对象中的 JavaScript;虽然我不确定是否记录了此行为,但我不会依赖出于安全目的)。

如果 data 属性引用了不同的域,您将无法访问嵌入页面的 cookie(通过 topparent;至少在 firefox 中是这样).

What are the implications of hosting the user content SVGs on the same domain? Should I instead host them on foobarusercontent.com?

是的,这会将用户的操作限制在原点 foobarusercontent.com(可能适合也可能不适合您的使用)。

Does the <object> tag support an equivalent of the sandbox attribute? Is there another way to set permissions for an <object>?

据我所知(另见 mozilla,其中未列出任何相关标签)。

What specifications describe the security model for <object>?

我不知道这方面的标准。因此,将 user-supplied 数据嵌入 object 时我会非常小心。将数据托管在指定域上是一个好主意。解析数据并过滤恶意 (javascript-related) 标签和属性也很好(如果可以接受的话)。请确保用户可以在该域上 运行 JavaScript 是可以接受的(即没有身份验证 cookie;我也不允许将 .js 文件上传到该域,因为它会允许安装 serviceworkers ,这将允许攻击者记录用户访问的 URL,从而可能泄露域上托管的(私人)文件)。