在来自不同域的iFrame上运行bookmarklet

时间:2010-12-19 05:11:09

标签: javascript security iframe bookmarklet

有没有办法在来自不同域的iFrame上运行书签?

例如,我有一个从http://example.com加载的页面,其中有一个iFrame,其源设置为http://example2.com。当我运行书签时,它总是在http://example.com上运行,因为那是主页面。我想在另一个iFrame上运行它。

当我尝试与iFrame进行互动时(例如,将其源属性更改为javascript:alert('test')),Chrome会显示以下错误:

  

不安全的JavaScript尝试从包含网址http://example.com的网址访问包含网址http://example2.com的框架。域,协议和端口必须匹配。

我尝试将书签拖放到框架中,但它说:

  

无法加载资源

我有什么方法可以使用Chrome中的书签与iFrame交互?

3 个答案:

答案 0 :(得分:3)

有一种方法可以使用window.postMessage进行跨域消息传递(而不是任意代码执行),但是所有帧A都可以做到帧B(当它们不属于same origin时)传递一条消息,希望B有一个回调函数来监听这条消息。

所以在这里,如果您控制exemple2.com(框架中没有获得书签的内容),您可以让bookmarklet将消息传递给iframe并在iframe中处理它。

否则我认为你没有解决方案,除了非常复杂的解决方案(如代理)。

其他链接:

答案 1 :(得分:1)

iFrames和ajax调用一样具有很多安全性。

任何以跨域方式使用这些操作的尝试都将导致安全性错误。

想象一下,您可以与不同域上的其他iFrame进行交互。您可以制作宽度和高度均为100%的iFrame(如facebook登录页面)并添加一个函数以在提交事件上执行,该事件将通过电子邮件向您发送用户名并在提交之前传递。

所以你要完成你想要做的事情会有很多麻烦。你基本上不能搞乱你不拥有的页面。您可以使用firebug来编辑html选项卡。

希望有所帮助

答案 2 :(得分:1)

如果您无法控制页面或iframe,则可以选择将iframe加载到新窗口中。 iframe的src属性可供父JS读取,然后可以打开新的选项卡或窗口。然后,用户可以再次单击书签,将其加载到新页面中。