3

多くのWebページには、外部スクリプトが含まれています。Facebookのようなボタン、分析や広告システムのクライアントコード、外部のコメントプロバイダーなどです。

常にoriginヘッダーがチェックされるため、これらのスクリプトは私のAjaxリソースにアクセスできません。

しかし、私はこれらのスクリプトが私のページにあるWebSocket接続で何ができるかについて少し心配しています。ここで、原点ヘッダーは、私が理解している限り、ハンドシェイク中にのみチェックされます。

接続を開いて、次のようなonmessageハンドラーを定義するとします。

var ws = new WebSocket("ws://host/resource");
ws.onmessage = function(evt) { my stuff ... }

外部スクリプトはonmessageハンドラーを再割り当てできないため、サーバーがWebSocketを介してブラウザーに送信するすべてのものにアクセスできますか?好き

var oldHandler = ws.onmessage;
ws.onmessage = function(evt) { 
   externalscript.readMystuffAndDoEvilThings(evt); 
   oldHandler(evt); 
}

なぜそれが不可能なのかわかりません。wss://もセッションCookieやその他のものもそれを妨げることはありません。しかし、多分私は何かが欠けていますか?

4

1 に答える 1

1

あなたは何も見逃していません。外部(クロスオリジン)スクリプトをブラウジングコンテキストにロードした場合、そのスクリプトには「ローカル」(同じオリジン)スクリプトと同じ権限があります。外部スクリプトは、同じ方法でXHRコールバック、console.log-s、およびその他すべてを置き換えることができます。

このような悪意のある外部スクリプトの問題は、a)アプリにそれらをロードすることをいとわない必要があり、b)スクリプトが何を置き換えるか(関数/変数名)を知っている必要があることです。

このような攻撃を防ぐ方法は、JavaScriptモジュールパターンと呼ばれるものを使用することです。すべてのコードを無名関数でラップし、その関数をすぐに実行します。このように、コードはクロージャー(ローカルスコープ)内で実行されるため、外部スクリプトから保護されます。パターンの詳細とバリエーションについては、こちらをご覧ください:http: //addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

于 2013-01-06T22:28:06.150 に答える