javascript - 绕过iframe跨域安全

时间:2013-08-12 15:33:36

标签: javascript iframe

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

我们有几个发布商网站都有我们简单的javascript文件(通过Amazon CloudFront提供),这些文件直接嵌入到他们的网站上。该脚本会在发布商网站上执行一些操作(修改DOM),以显示我们针对每个发布商网站进行不同排名的静态广告。

当我们通过iframe(Google DFP广告管理系统)投放相同的脚本时,由于iframe网址与发布商网站网址不相关,因此跨域安全性显然无效。

现在我们使用另一个广告服务器,为了解决每个发布商所拥有的HTML文件(因此每个发布的相对路径类似于/iframe-buster.html),其中包含一些允许广告展开的javascript在iframe之外。我不明白我的想法到底是做什么的:

  1. 通过iframe投放的广告会创建一个带有iframe buster的网址路径的子框架
  2. 新的iframe网址包含查询字符串变量(例如广告标识符)
  3. iframe JS然后可以通过调用parent.parent或top来修改文档DOM。?
  4. 我不知道这是否有用,有人知道或尝试过这样的事情吗?

1 个答案:

答案 0 :(得分:1)

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

这里的问题是 - 在运行时,pub页面上的脚本知道什么是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破坏者路径的子路径” - 这是不可能的,因为iframe不知道发布者域,并且由于安全限制,它可以'弄清楚。