Javascript 如何向兄弟iFrame发送邮件

Javascript 如何向兄弟iFrame发送邮件,javascript,iframe,xss,postmessage,Javascript,Iframe,Xss,Postmessage,我正在寻找一种在父页面中不使用任何javascript的情况下将消息发送到同级iFrame的方法。我遇到的困难是试图从第一个iFrame获取另一个iFrame的窗口对象 页面的布局如下所示: html body (http://host.com/) iFrame#a (http://me.com/a) iFrame#b (http://me.com/b) 从iFrame#a中,我正在尝试: (iFrame#b window).postMessage(...) 问题是我不知道如何从iF

我正在寻找一种在父页面中不使用任何javascript的情况下将消息发送到同级iFrame的方法。我遇到的困难是试图从第一个iFrame获取另一个iFrame的窗口对象

页面的布局如下所示:

html body (http://host.com/)
  iFrame#a (http://me.com/a)
  iFrame#b (http://me.com/b)
iFrame#a
中,我正在尝试:

(iFrame#b window).postMessage(...)

问题是我不知道如何从
iFrame\a
中获取
iFrame\b
的窗口对象
parent.getElementById()
和其他函数受XSS限制。我只想向父页面上来自我的域的所有其他iFrame发出
postMessage
http://me.com/在上面的示例中。

您将无法执行此操作,因为iframe无法与其所添加的页面(或该页面中的任何内容)交互,除非父对象位于同一域下(在您的示例中,情况并非如此)。如果可以,它将造成XSS安全问题,正如您所指出的,您已经意识到了这一点

相反,您可以:

  • 在/a/中设置cookie并在/b/中对其进行轮询/(这将非常昂贵,尽管/b/必须以某种方式继续呼叫服务器)
  • 使用“HTML5”持久数据存储机制,存储来自/a/的数据,并在/b/中对其进行轮询/(可能可以使用)
  • 使用链接通过服务器链接所有兄弟姐妹
  • 重新考虑一下你想要做什么:你想要达到的目标听起来很奇怪——你确定没有比使用这样的iFrame更好的方法了吗

虽然确实不可能与另一个域上的另一个窗口/iframe交互,但是可以获得对这样一个窗口/iframe以及嵌入该窗口/iframe的所有子iframe的引用。方法是使用
window.top.frames
(访问顶部窗口对象)或
window.parent.frames
(用于访问直接父窗口对象,而可能存在其他更高级别的父对象)。无需使用
getElementById
或其他与DOM相关的函数。有关更多信息,请参阅此:

window.frames属性返回一个类似数组的对象,然后可以对该对象进行迭代,并在每个iframe上执行postMessage。这不会触发相同的原点限制,因为除了在任何窗口上使用postMessage之外,您不会以任何方式与任何窗口进行交互。因为您希望在特定域的每个iframe上执行postMessage,您只需执行以下操作:

var frames = window.parent.frames;
for (var i = 0; i < frames.length; i++) { 
  frames[i].postMessage("hello", targetDomain);
}
var frames=window.parent.frames;
对于(var i=0;i