绕过iframe跨域安全

bypassing iframe cross domain security

本文关键字:安全 iframe 绕过      更新时间:2023-09-26

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

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

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

现在,我们使用另一个广告服务器,以绕过它们,每个发布者都有一个HTML文件(因此每个pub的相对路径类似于/iframe buster.HTML),其中包含一些javascript,允许广告在iframe之外扩展。根据我的想法,我不明白它到底是干什么的:

  1. 通过iframe提供的广告创建了一个子帧,其中包含iframe buster的URL路径
  2. 新的iframe URL包含一个查询字符串变量(如广告标识符)
  3. iframeJS可以通过调用parent.parent或top来修改文档DOM

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

发布者网站上托管的脚本不需要(实际上不应该)破坏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 buster URL路径的子帧"-这是不可能的,因为iframe不知道发布者域,也因为安全限制,它也不知道。