是否可以使用postMessage将函数发送到另一个窗口而不必评估它?

时间:2011-02-23 17:15:06

标签: javascript html5

postMessage只接受字符串,因此必须将其转换为字符串(这不是问题)。然而,一旦它在那里它需要执行。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

不要发送一个功能,当然不会evalonmessage事件中收到的任何内容 - 它可能来自任何地方。

交叉文档消息传递是浏览器实现的同一起源安全策略中的一个设计漏洞,如果您打算有意识地解决该策略,您有责任了解您正在做什么并自己处理安全性。通过调用eval,您基本上可以在您的页面上运行,可能包含您的用户数据,黑客可以欺骗您的页面接受任何JavaScript。

更好的方法是将允许的操作列入白名单,然后根据传入onmessage的内容在其中进行选择。

function receiveMessage(event)
{
  // Do we trust the sender of this message?
  // Test for the domain that will be sending messages
  if (event.origin !== "http://example.com:")
    return;

  if (event.data == 'command1') doCommand1(); //define these functions elsewhere
  if (event.data == 'command2') doCommand2(); //note no data is passed from the event
}

window.addEventListener("message", receiveMessage, false);

如果您想传递参数,请使用JSON.stringify()。如果您预期有一组预定义的参数,那么您可以使用与上面相同的方法,无需将潜在未知来源的字符串直接传递到您的代码中。如果您确实需要处理变量参数,那么请使用来自未知来源的字符串采取所有标准预防措施。