tl;dr信頼されていないスクリプトを iframe で安全に実行できますか?
バックストーリー:
安全な JSONP リクエストを作成しようとしています。古いブラウザーの多くは Web Worker をサポートしていません。つまり、私が思いついた現在のソリューションは最適ではありません。
を作成し、<iframe>
その中にスクリプトをロードできると考えました。このスクリプトは JSONP リクエストを実行し (script タグを作成)、メイン ページにメッセージを投稿します。メイン ページはメッセージを取得し、コールバックを実行して 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
です.parent
。
親スコープのデータにアクセスできない iframe を作成する方法はありますか?
script タグを介して追加されたスクリプトが親ウィンドウ (および DOM) の変数にアクセスできない iframe を作成したいと考えています。私は次のようなことを試しtop=parent=null
ましたが、それで十分かどうかはわかりません。他の回避策があるかもしれません。for... in ループを実行しようとしましたが、関数が機能しなくなり、その理由を特定できませんでした。
ノート:
私は、WebWorkers がより優れた隔離された環境であることが最適であることを知っています。私は JSONP が「悪い」技術であることを知っています (私は何人かの無作為な人に、今日は決してそれを使用しないと言われました)。JSONP クエリを実行する必要があるシナリオ用の安全な環境を作成しようとしています。