是否可以在没有"allow-scripts"标志的情况下向沙盒iframe发送帖子消息?



Basicly我有一个跨域的iframe,无法启用允许脚本标志,但同时我需要获取iframe文档中<script>标记中的postMessage,或者访问iframe contentDocument。

我试过:

let iframeElement = document.getElementsByTagName('iframe')[0];
let iframeContent = iframeElement.contentDocument
console.log(iframeContent)

但是使用沙箱标志,我只得到一个null返回。

我需要做的是这三个选项之一:

  • 将eventListener添加到iframe contentDocument中的标记中
  • 获取iframe contentDocument中的attr值
  • 一种从原始页面发送JSON并在带有iframe(postMessage(的页面中获取该JSON的方法

但所有这些都没有允许脚本标志,我试图归档的内容可能吗?

简单的答案是

一个<iframe>的sandbox属性限制了脚本的使用,因此无法执行脚本。因此,您将无法从此iframe的上下文中调用postMessage(),也无法向事件侦听器发出回调。

现在,由于您的文档不满足跨来源策略,您陷入了困境,无法与<iframe>的文档。


如果此功能是必须具备的,唯一的解决方法是将您的服务器用作代理,以便您的iframe的内容实际上由您自己的服务器获取和服务。

这样,就不再有跨源问题了(如果你在你的iframe上添加allow-same-origin策略(,你将能够从你父母的文档中访问你的ifame的内容,甚至添加事件监听器,即使仍然没有脚本可以从这个<iframe>的上下文中,所有内容都将从main的doc上下文中运行。(这意味着<iframe>中仍然没有postMessage()(。

引用部分问题,

我需要获取iframe文档中<script>标记中的postMessage

如果您的意思是需要放入注入包含postMessaging的<script>标记,那么恐怕这是不可能的,因为同源策略会阻止它。

然而,如果您正试图访问或收听来自跨源iframe内<script>标签的postMessage广播,那么是的,这正是postMessage的设计目的。假设您的消息事件侦听器托管在postMessage的targetOrigin参数中定义的原点上。

PostMessage本质上是一种信任契约,旨在克服跨来源的障碍;要么拥有。。。

  • 对iframe内容的访问权限
  • 被委托通过托管在定义的targetOrigin上(推荐(或在targetOrigin具有通配符"*"值的情况下位于任何原点(not推荐(来侦听广播消息

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Security_concerns

最新更新