我从我不信任的来源获取要放入 iframe 的内容。为了满足特定的需求,我希望内容(可能包括 javascript)根本无法设置 cookie。实现这一目标的推荐方法是什么?
编辑:我知道这与这个问题类似。我应该早点提到这一点,但 iframe 具有跨域源。我想禁止里面的内容设置cookies,即使是在它自己的源上。沙箱可以实现这一点吗?谢谢。
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 来存储数据,等等
截至2024年底,我们现在对iframe属性credentialess
有部分支持(caniuse给出的72%)。
这会导致无凭证内部的文档
使用新的、短暂的上下文加载 - 那些 上下文没有 访问与其来源相关的数据,例如 cookie 和本地存储。<iframe>
换句话说,Firefox 和 Safari 缺乏支持。
<iframe
src="https://en.wikipedia.org/wiki/cookies"
credentialless="true">
</iframe>
从控制台,使用支持的浏览器,没有设置
credentialess
属性,我们可以观察来自 SO 的 src-policy 消息,如果启用该属性,SO 就会消失(隔离有效)