为其他域的 iframe 创建内容

Posted

技术标签:

【中文标题】为其他域的 iframe 创建内容【英文标题】:Create content for iframe of other domain 【发布时间】:2012-05-30 11:03:30 【问题描述】:

对于我们的论文,我们需要开发一个 AdJail 方法的原型,该方法提供针对恶意广告的安全性。该方法通过将广告脚本放置在具有不同来源的 iframe 中的“影子页面”中来隔离广告脚本。 (受同源策略保护)通过将原始页面的内容复制到影子页面,adscript 只能访问发布者允许访问的内容。

问题在于为 shadowpage 创建 iframe。 最初,我们是这样实现的:

if (document.createElement && (iframe = document.createElement('iframe'))) 
        iframe.id = "shadowpage";
        iframe.name = "shadowpage";
        iframe.height = 1400; 
        iframe.width = 1400;
        document.body.appendChild(iframe);
        var shadowScript = document.createElement("script");
        shadowScript.src = "ShadowTunnelScript.js";
        iframe.contentDocument.body.appendChild(shadowScript);
        adUrl = adScript;

显然,这不提供同源策略的请求安全性,因为此 iframe 与包含页面具有相同的源。

我们的替代方案如下,将 iframe 的 src 设置为具有不同来源的页面:

if (document.createElement && (iframe = document.createElement('iframe'))) 
        iframe.id = "shadowpage";
        iframe.name = "shadowpage";
        iframe.height = 1400; 
        iframe.width = 1400;
        iframe.src = "http://***/AdJail/Shadowpage.html";
        //iframe.style.display = "none";
        document.body.appendChild(iframe);

但在这种情况下,我们原型的用户需要自己在不同的服务器上创建一个影子页面。

我们的问题是:是否可以创建这样一个不同来源的 iframe,动态生成这个 iframe 的内容,这样用户只需要调用一个库而不需要自己提供 shadowpage。

这是否可能通过首先生成 iframe 的内容然后以某种方式更改 iframe 的来源?

【问题讨论】:

HTML5 在 iframe 上有“沙盒”属性。但我想浏览器支持需要时间才能赶上。 【参考方案1】:

您可以尝试为 document.domain 设置一个值或将 iframe 内容设置为 datauri :

var content=window.btoa('<html>(..)<script>document.domain='sandbox';</script></html>');
iframe.src = "data:text/html;base64,"+content;

【讨论】:

以上是关于为其他域的 iframe 创建内容的主要内容,如果未能解决你的问题,请参考以下文章

<iframe>内的内容可以控制吗?

使用 iframe 或其他东西绕过代理

我可以在 UIWebView javascript 注入中访问其他域的其他框架中的 HTML DOM 吗?

用jquery设置fancybox高度

前端跨域

如何在我的扩展程序的新标签页中将其他扩展程序的新标签页加载为 iFrame