2

我正在尝试使用 iframe 和 javascript 解决跨域安全问题。

我们有几个发布者网站,它们的网站上直接嵌入了我们的简单 javascript 文件(通过 Amazon CloudFront 提供服务)。该脚本在发布商网站上执行一些操作(修改 DOM)以显示静态广告,我们针对每个发布商网站定位不同。

当我们通过 iframe (Google DFP) 提供相同的脚本时,由于跨域安全性,它显然不起作用,因为 iframe URL 和发布商网站 URL 不相关。

现在我们使用另一个广告服务器,以解决每个发布者托管的 HTML 文件(因此每个发布者的相对路径类似于 /iframe-buster.html),其中包含一些允许广告在框架。我不明白我的想法到底是什么:

  1. 通过 iframe 投放的广告会创建一个子框架,其中包含指向 iframe buster 的 URL 路径
  2. 新的 iframe 网址包含查询字符串变量(例如广告标识符)
  3. 然后 iframe JS 可以通过调用 parent.parent 或 top 来修改文档 DOM。?

我不知道这是否可行,有人知道或尝试过这样的事情吗?

4

1 回答 1

1

发布者网站上托管的脚本不需要(实际上不应该)破坏 iframe。相反,此脚本的目的是在 AD iframe(托管在 DFP 内)和发布商页面之间建立通信渠道。

这里的问题是 - 在运行时,发布页面上的脚本知道什么是 DFP iframe url 域,但由于跨域访问限制,通过 cloudfront 提供的脚本不知道发布者页面 url 是什么。

因此发布者脚本可以设置一个 postMessage 处理程序来接收来自广告 Iframe 的消息。它可以做类似的事情

        function registerPostMessageHandler() {
            // Listen to message from child window
            var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
            var eventer = window[eventMethod];
            var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";

            eventer(messageEvent,function(e) {
                var key = e.message ? "message" : "data";
                var data = e[key];
                console.log("Message obtained from origin " + e.origin + ' data: ' + data);

                //Insert an AD slot based on the message
            },false);
        }

AD iframe 中的 JS 可以做到

parent.postMessage(/*where to create the AD slot*/);

注意: “通过 iframe 投放的广告会创建一个带有指向 iframe buster 的 URL 路径的子框架”——这是不可能的,因为 iframe 不知道发布商域,并且由于安全限制,它也无法确定。

于 2015-01-01T07:08:42.860 回答