防止 iframe 内的任何内容设置 cookie 的推荐方法

问题描述 投票:0回答:2

我从我不信任的来源获取要放入 iframe 的内容。为了满足特定的需求,我希望内容(可能包括 javascript)根本无法设置 cookie。实现这一目标的推荐方法是什么?

编辑:我知道这与这个问题类似。我应该早点提到这一点,但 iframe 具有跨域源。我想禁止里面的内容设置cookies,即使是在它自己的源上。沙箱可以实现这一点吗?谢谢。

javascript iframe cookies
2个回答
30
投票

简短回答:

HTML5

sandbox
属性防止 iframe 读取/写入 cookie。 对于同源和跨源 iframe 都是如此。

allow-scripts
属性启用 JavaScript,但不会干扰 cookie 的限制。

<iframe sandbox="allow-scripts" src="..."></iframe>


长答案:

所以,如果您不完全相信,这个适合您......

根据W3C工作草案(2010)和W3C建议书(2014),当用户代理(浏览器)解析

sandbox
属性时,必须添加某些标志,然后使用这些标志来限制iframe 内的内容。 其中一个标志旨在强制内容进入唯一的来源,并阻止其读取/写入 cookie:

指定

sandbox
属性后,将对
iframe
托管的任何内容启用一组额外限制。

指定 sandbox 属性时,iframe 元素的嵌套浏览上下文必须具有以下列表集中给出的标志。

...

...

沙盒源浏览上下文标志,除非沙盒属性的值在空格上分割时发现设置了allow-same-origin关键字

此标志强制内容进入唯一的来源,从而防止它访问来自同一来源的其他内容。

此标志还防止脚本读取或写入 document.cookie IDL 属性,并阻止对 localStorage 的访问。 [网络存储]

当沙盒 iframe 尝试写入 cookie 时,会引发以下异常:

未捕获的 DOMException:无法在“文档”上设置“cookie”属性:该文档已沙箱化并且缺少“允许相同来源”标志。

并且从未写入任何 cookie。

由于沙盒 iframe 根本无法写入 cookie,因此即使在其原始站点上也无法设置 cookie。 (事实上,这将是使用

allow-same-origin
关键字的用例之一)。

allow-same-origin 属性适用于两种情况。

...

其次,它可用于嵌入来自第三方站点的内容,进行沙箱处理以防止该站点打开弹出窗口等,而不会阻止嵌入页面与其原始站点通信,使用数据库 API 来存储数据,等等


0
投票

截至2024年底,我们现在对iframe属性credentialess

有部分支持(
caniuse给出的72%)。

这会导致无凭证内部的文档

<iframe>
使用新的、短暂的上下文加载 - 那些 上下文没有 访问与其来源相关的数据,例如 cookie 和本地存储。

iframe credentialess support 2024

换句话说,Firefox 和 Safari 缺乏支持。

<iframe
  src="https://en.wikipedia.org/wiki/cookies"
  credentialless="true">
</iframe>

从控制台,使用支持的浏览器,没有设置

credentialess
属性,我们可以观察来自 SO 的 src-policy 消息,如果启用该属性,SO 就会消失(隔离有效)

src-policy origin trial error

© www.soinside.com 2019 - 2024. All rights reserved.