gpt4 book ai didi

javascript - 使同一域 iframe 安全

转载 作者:数据小太阳 更新时间:2023-10-29 05:33:45 25 4
gpt4 key购买 nike

tl;dr 我可以在 iframe 上安全地执行不受信任的脚本吗?

背景故事:

我正在尝试 make secure JSONP requests .许多旧版浏览器不支持 Web Workers,这意味着我提出的当前解决方案并不是最优的。

我想我可以创建一个 <iframe>并在其中加载脚本。该脚本将执行一个 JSONP 请求(创建一个脚本标签),该请求将向主页发布一条消息。主页会收到消息,执行回调并销毁 iframe。我设法 do this sort of thing .

function jsonp(url, data, callback) {
var iframe = document.createElement("iframe");
iframe.style.display = "none";
document.body.appendChild(iframe);

var iframedoc = iframe.contentDocument || iframe.contentWindow.document;
sc = document.createElement("script");

sc.textContent = "(function(p){ cb = function(result){p.postMessage(result,'http://fiddle.jshell.net');};})(parent);";
//sc.textContent += "alert(cb)";
iframedoc.body.appendChild(sc);
var jr = document.createElement("script");

var getParams = ""; // serialize the GET parameters
for (var i in data) {
getParams += "&" + i + "=" + data[i];
}

jr.src = url + "?callback=cb" + getParams;
iframedoc.body.appendChild(jr);
window.onmessage = function (e) {
callback(e.data);
document.body.removeChild(iframe);
}

}

jsonp("http://jsfiddle.net/echo/jsonp/", {
foo: "bar"
}, function (result) {
alert("Result: " + JSON.stringify(result));
});

问题在于,由于 iframe 在同一个域中,注入(inject)的脚本仍然可以通过 .top 访问外部范围。或 .parent等等。

有什么方法可以创建无法访问父作用域数据的 iframe 吗?

我想创建一个 iframe,其中通过脚本标签添加的脚本将无法访问父窗口(和 DOM)上的变量。我试过类似 top=parent=null 的东西但我真的不确定这是否足够,可能还有其他解决方法。我尝试运行 for...in 循环,但我的函数停止工作,而且我无法找出原因。

注意:

我知道 WebWorkers 是一个更好的隔离环境。我知道 JSONP 是一种“糟糕”的技术(我什至有 some random guy 告诉我他今天永远不会使用它)。我正在尝试为您必须执行 JSONP 查询的场景创建一个安全的环境。

最佳答案

您不能真正删除引用,设置 null 只会默默地失败,并且总有办法获取对父 dom 的引用。

frameElementframeElement.defaultView 等引用不能被删除。尝试这样做将静默失败或抛出异常,具体取决于浏览器。

你可以看看Caja/Cajita虽然。

关于javascript - 使同一域 iframe 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16681460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com