【问题标题】:Java script in IFRAME security issuesIFRAME 中的 Java 脚本安全问题
【发布时间】:2011-06-18 18:08:24
【问题描述】:

http://imaginaryman-test.blogspot.com/ 网站上,打字机位于 IFAME 内部。当您直接访问该站点http://castedspell.com/mark/ 时,所有浏览器都可以正常工作,但是当查看嵌入在 IFRAME 中的版本时,它在 IE 上不起作用并在 Chrome 中引发错误。

不安全的 JavaScript 尝试从 URL http://castedspell.com/mark/ 的框架访问 URL http://imaginaryman-test.blogspot.com/ 的框架。域、协议和端口必须匹配。

这是嵌入式 IFRAME 的源代码 https://github.com/totheleftpanda/typeWrite/tree/master/mark

我知道这是一个安全问题,但我不知道如何解决它,也找不到任何可以帮助我解决问题的材料。

【问题讨论】:

  • 没有人回答为什么这不起作用的基本问题。
  • 我在 swf 发生任何事情之前看到了错误。您可以尝试注释掉嵌入的 swf,看看您是否仍然在 chrome 中看到错误?

标签: javascript flash security iframe


【解决方案1】:

最简单的方法是设置一个 PHP(或任何服务器语言)代理,它只从其他域获取页面内容并将其输出。唯一真正的缺点是没有发送远程域客户端的 cookie。

【讨论】:

【解决方案2】:

看看http://benalman.com/projects/jquery-postmessage-plugin/。这是一个在两个帧之间发送消息的 jquery 插件。这两个帧不需要在同一个域上。但是您确实需要访问这两个页面才能修改它们。我还在这里写了一篇回答 iframe 之间通信的帖子。 How to capture clicks from iframe on another domain?

【讨论】:

    【解决方案3】:

    您唯一的机会是 easyXDM。 (或者使用哈希手动完成,但更喜欢easyXDM)

    查看 SO 答案:Cross-domain hash change communication

    例如。如果你想调用一个方法:
    http://easyxdm.net/wp/2010/03/17/remote-procedure-calls-rpc/

    编辑:

    如果我在 Firefox 中尝试您的演示,我根本不会收到“不安全的 JavaScript 尝试访问”错误。但是在 Chrome 中它被抛出了很多次。
    您的示例中有很多其他代码,我什至不确定您的代码是否会导致问题。你应该做一个非常有限/基本的测试,看看你的 flash-communication 是否工作,没有所有其他的 javascripts。

    【讨论】:

    • 什么叫跨域?我正在调用的 Flash 应用程序位于 Iframe 内。
    • 您正在使用 javascript 在 iframe 中调用另一个域中的方法...所以它是跨域
    • 即使 JS 在 I 框架中。这没有任何意义,它只会引发与同样嵌套在 Iframe 中的 Flash 界面相关的错误。
    【解决方案4】:

    我之前也遇到过类似的问题。基本上,如果您的 iframe 包含来自与主页域不同的域的页面,则 javascript 将无法跨越它们之间的界限。 iframe 中的 Javascript 将能够在 iframe 中进行对话,主页中的 javascript 将能够在主页中进行对话,但它们之间将无法相互对话。

    这是一个旨在阻止跨站点脚本攻击的安全问题。您可以采取许多技巧来解决这个问题,但它们都(或至少是我所知道的)相当多毛。

    在进一步尝试之前,您应该回答以下问题:

    1) 您到底想在使用 javascript 的页面之间做什么?
    2) 你可以访问这两个页面的来源吗?

    【讨论】:

    • 1) 我确实可以访问页面的两个来源。 2)我没有尝试访问我不相信的页面之间的任何内容。我正在尝试从同一 IFRAME 中的 IFRAME 调用外部闪存功能。莫非是flash播放器把js函数导出到外窗了?
    • 嗯。我不认为 Flash 播放器会尝试将 JS 函数导出到外部窗口。它唯一可能做的事情是将javascript注入iframe,然后尝试访问parent.somethingOrOther。如果您说您正在调用外部闪存函数,那么您使用什么来调用外部函数? Javascript?
    • 是的,我正在使用 flashes 外部接口库 github.com/totheleftpanda/Brujita/blob/master/www/mark/… 将 playSound() 函数从 flash 导出到 JS
    【解决方案5】:

    这可能比上述答案简单得多。看起来像这个函数:

    function playSound(){
        swf.playSound();
    }
    

    在swf实际赋值给它下面的函数中的swfObject之前写在DOM时间线上。

    我建议将该功能进一步向下移动,然后重新测试。

    【讨论】:

    • 定义一个函数不会调用它。
    • 这已经在代码中了,我不建议写一个新函数。我的意思是,函数“playSound”是在 swf 附加方法之前定义的,因此,根据 IE 的 DOM,swf.playSound() 将是一个未定义的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2011-09-25
    相关资源
    最近更新 更多