Shadow DOM 是不是能够保护元素?

Posted

技术标签:

【中文标题】Shadow DOM 是不是能够保护元素?【英文标题】:Is Shadow DOM able to secure elements?Shadow DOM 是否能够保护元素? 【发布时间】:2012-12-29 14:46:15 【问题描述】:

目标:一个封装的小部件

假设我是一个显示朋友列表的小部件的开发者,例如:

你的朋友 Michael、Anna 和 Shirley 喜欢这个网页!

第一种方法:创建span 的脚本

天真地,我创建了一个脚本,将这些信息放在网站上的span 中。但是,ExampleSite 的所有者现在可以通过简单的 DOM 操作访问您朋友的姓名! 这是一个很大的隐私/安全问题。

第二种方法:iframe

我不希望 ExampleSite 有权访问他们朋友的姓名。因此,我让网站所有者使用iframe 添加小部件:

<iframe src="http://fakebook.com/friends?page=http%3A%2F%2Fexample.org%2F"></iframe>

这是可行的,因为 ExampleSite 的所有者无法抓取 iframe 的内容。然而,整个iframe 的东西相当丑陋,因为它没有整合 到网站的样式中,而span 可以。

所需的方法:Shadow DOM

昨天阅读Shadow Dom 时,我想知道这是否可以解决这两个问题。这将允许我有一个脚本来创建一个 span 原始网站无法访问:

var host = document.querySelector('#friends');
var root = host.webkitCreateShadowRoot();
root.textContent = 'Your friends Michael, Anna and Shirley love this webpage!';
然而,**Shadow DOM 是否会从周围的页面中隐藏其内容?** 这里的假设是除了我的脚本之外没有人可以访问“root”,但这是正确的吗?

Shadow DOM spec 毕竟说它提供功能封装,但我实际上想要信任封装。虽然组件模型用例实际上列出了this use case,但我不确定 Shadow DOM 是否实现了必要的限制属性。

【问题讨论】:

“然而,整个iframe 的东西相当丑陋,因为它没有融入网站的样式,而span 可以。” &lt;iframe seamless&gt; 解决了这个问题。 您不应依赖“尚未完全标准化且仍在不断变化”的 API。我只会使用一个框架,让它们传递一些基本样式(背景颜色、颜色等) @MathiasBynens seamless 似乎很有趣。什么是浏览器支持? @WaleedKhan 我没有说这是我明天需要实施的东西。我只是想知道 Shadow DOM 是否提供这种安全性。 @RubenVerborgh WebKit has (at least some level of) seamless support。据我所知,没有其他浏览器引擎可以这样做,但我又没有测试过。 【参考方案1】:

它没有,但它正在开发中:https://www.w3.org/Bugs/Public/show_bug.cgi?id=20144

信任的封装将涉及为每个影子树创建一个新的脚本上下文,这在大多数情况下都是多余的。然而,正如 bug 所说,我们将添加一个允许这样做的标志(详情待定)。

【讨论】:

感谢您的回答。网络上没有任何信息明确指出这一事实,即计划使用此功能。对于其他读者:我在公共 webapps 邮件列表 lists.w3.org/Archives/Public/public-webapps/2014JanMar/… 上找到了关于隔离类型的讨论 WebKit 贡献者的这个回答可能很有趣:github.com/w3c/webcomponents/issues/100#issuecomment-161867941

以上是关于Shadow DOM 是不是能够保护元素?的主要内容,如果未能解决你的问题,请参考以下文章

为原生 Shadow DOM 元素设置样式

IOS Safari 是不是支持 Shadow DOM?

基于 Shadow DOM 根的字体大小 css-values

是否可以通过父文档访问 Shadow DOM 元素?

shadow dom 隔离代码 封装

shadow DOM