【问题标题】:Loading embedded iframe with same protocol as window top to prevent Same Origin Policy Violation使用与窗口顶部相同的协议加载嵌入式 iframe 以防止违反同源策略
【发布时间】:2013-02-16 08:47:45
【问题描述】:

我们正在开发一个 Javascript SDK,供嵌入式应用程序(作为 IFRAME 注入我的网站)使用,以帮助它们使用一些资源,例如加载一些对话框:例如授权对话框或共享框(如 Facebook)。

我们的 SDK 使用 easyXDM 或多或少像这样工作:

HTML 页面
-------------------------------------------------- -------------------------------------------------- ------------
| http / https:www.mysite.com/embedded-app/
| (一些 JS 类)
|
|- - - - - | -------------------------------------------------- -------------------------------------------------- --------------
|- - - - - | (IFRAME)
|- - - - - | https:// www.some-embedded-app-domain.com/page.html
|- - - - - | (从使用easyXDM的“http/https:www.mysite.com/sdk.js”加载并实例化SDK)
|- - - - - |
|- - - - - | - - - - - |-------------------------------------------- -------------------------------------------------- -----
|- - - - - | - - - - - | (easyXDM注入的IFRAME)
|- - - - - | - - - - - | http / https:www.mysite.com/embedded_provider.html
|- - - - - | - - - - - | (与 window.top 通信以使用那些 wndow.top JS 类)
|- - - - - | - - - - - |
|- - - - - | - - - - - |
|- - - - - | - - - - - |
|- - - - - | - - - - - |

我的网站可以同时使用 http/https 加载,但嵌入式应用程序必须使用 always HTTPS 提供服务。为了让easyXDM注入的内部iframe能够与我的站点通信,两个url中的主机和协议必须匹配,否则会出现同源策略违规。

问题:我如何告诉从外部应用程序 URL 加载的 SDK 中的代码,外部窗口(我的站点)正在使用 http 或 https,以使用相同的协议呈现 embedded_provider.html,因此允许两者之间的JS通信?

我能想到的唯一解决方案是以某种方式通知嵌入式应用程序我们当前正在从 http / https 浏览,然后它可以正确实例化它(使用标志 use_https 左右),但我更愿意不要强迫应用知道我们正在使用的协议。

你知道其他选择吗?

谢谢!

【问题讨论】:

  • 使用 // 代替 http:// 或 https://

标签: javascript sdk cross-domain same-origin-policy easyxdm


【解决方案1】:

我能想到的唯一解决方案(虽然还没有测试过)是让 easyXDM 放入 2 个测试 iframe - 一个在 http://www.mysite.com/url_test 上,一个在 https://www.mysite.com/url_test 上。

然后让您的 /url_test 网页尝试访问 window.top.location.href。如果 /url_test 可以看到该位置,则它必须在同一个域上。然后成功的 /url_test 页面将通过 easyXDM 与父 iframe(在 some-embedded-app.com 上)通信,以在正确的主机上创建您真正想要的 iframe。

注意:在错误主机上的 /url_test 页面将开始在控制台中转储同源 iframe 警告。 :)

注意 #2:如果这种方法有效,您可以通过说“由于产品域,我知道 80% 的这些嵌入将在 http 上。我将首先在 http 上进行 /url_test ,然后尝试使用 https 作为备份。”

【讨论】:

    【解决方案2】:

    使用 // 代替 http:// 或 https://

    浏览器会整理出来

    【讨论】:

    • 很遗憾,这不起作用,因为第一个 IFRAME 总是在 HTTPS 上加载(因此“//”将始终被解析为 https),但最外面的窗口可能在 HTTP 上.
    猜你喜欢
    • 2016-11-13
    • 2017-07-22
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多