6

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 クエリを実行する必要あるシナリオ用の安全な環境を作成しようとしています。

4

2 に答える 2

1

tl;dr いいえ

信頼されていないスクリプトは、Cookie (セッション ID など) を盗んだり、クレジット カードの入力フィールドの値などの情報を DOM から読み取ったりする可能性があります。

JavaScript は、すべてのコードが信頼できるコードであるというセキュリティ モデルに依存しています。別のドメインからのアクセスを試みるには、明示的なホワイトリスト登録が必要です。

iframe をサンドボックス化する場合は、別のドメインからページを提供できます。これは、悪用される可能性があるため、セッションを共有したり、あらゆる種類の通信を行うことができないことを意味します. 無関係なウェブサイトを含めるようなものです。それでも、信頼できない JavaScript を許可すると、悪用される可能性があります。たとえば、次window.top.location.href = 'http://my.phishing.domain/';のことを行うことができます。ユーザーはリダイレクトに気付かない可能性があります。

于 2013-05-22T00:08:54.767 に答える