tl;dr我可以在 iframe 上安全地执行不受信任的脚本吗?
背后故事:
我正在尝试发出安全的 JSONP 请求。许多旧浏览器不支持 Web Workers,这意味着我提出的当前解决方案不是最佳的。
我想我可以在其中创建<iframe>
并加载一个脚本。该脚本将执行 JSONP 请求(创建脚本标记),该请求会将消息发布到主页。主页面将获取消息,执行回调并销毁 iframe。我已经设法做这种事情。
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 位于同一域中,因此注入的脚本仍然可以通过.top
or.parent
等访问外部范围。
有什么方法可以创建一个无法访问父范围数据的 iframe?
我想创建一个 iframe,其中通过脚本标签添加的脚本将无法访问父窗口(和 DOM)上的变量。我尝试了类似的东西,top=parent=null
但我真的不确定这是否足够,可能还有其他解决方法。我尝试在循环中运行 for...,但我的函数停止工作,我无法找出原因。
笔记:
我知道最好的 WebWorkers 是一个更好的隔离环境。我知道 JSONP 是一种“糟糕”的技术(我什至有一些随机的人告诉我他今天永远不会使用它)。我正在尝试为必须执行 JSONP 查询的场景创建一个安全的环境。