1

親ドキュメントで定義されている JavaScript 関数のコードを送信しています。

var fn = function(){ 
           // code here that is going to be eval'd
         };

$('#iframe').get(0).contentWindow.postMessage(encodeURI(fn.toString()));

iframe で評価される:

$(window).bind('message', function(e){
  eval('(' + decodeURI(e.originalEvent.data) + ')();');
}); 

私がこれを行っている理由は、コードを簡単に管理できるからです。この方法では、すべての js が 1 つのファイルに含まれているためです :)

しかし、それは安全ですか?

コードを変更できるのは、コードが評価されるコンピューターと同じ人だけですよね?

4

5 に答える 5

4

可能であれば避けるべき一般的なルールはeval別として、現在のコードは安全ではありません。

クロス ドキュメント メッセージングは​​、クロスオリジン通信の安全な手法であると考えられています。ここで最も重要な側面は、発信元を尊重することです。送信者は、どの発信元のどのドキュメントにメッセージを送信できるかを決定でき、受信者は、どの発信元からのメッセージを受け入れることができるかを決定できます。

しかし、あなたの場合、送信者は受信者のオリジンを指定せず、受信者は送信者のオリジンをチェックしません。これは、送信者が間違った受信者にメッセージを送信する (フレームのドキュメントが変更される) か、受信者が間違った送信者からの潜在的な悪意のあるコードを含むメッセージを受け入れる (ドキュメントが悪意のあるページに埋め込まれている) 可能性があるため、セキュリティ上の弱点です。

postMessageしたがって、クロスドキュメント メッセージングを安全にするには、常に呼び出し内で送信者の発信元を指定します。

otherWindow.postMessage(message, "http://example.org:8080");

また、メッセージを受信するときは常に発信元を確認してください。

function receiveMessage(event) {  
    if (event.origin !== "http://example.org:8080") return;
    // ...
}
window.addEventListener("message", receiveMessage, false);

同じオリジン内で通信している場合は、次を使用できますwindow.location.origin

// sender
otherWindow.postMessage(message, window.location.origin);

// recipient
if (event.origin !== window.location.origin) return;

window.location.originWebKit でのみ利用できるようですが、回避策は次のとおりです。

if (!window.location.hasOwnProperty("origin")) {
    window.location.origin = window.location.protocol + "//" + window.location.host;
}
于 2012-06-22T19:16:38.523 に答える
2

「安全」に関しては、技術的にユーザーの完全な制御下にあるウィンドウについて話している (ユーザーが十分に精通している場合)、別のそのようなウィンドウまたは iframe と通信します。したがって、基本的にはすべてユーザーの管理下にあります。クライアント上の他のものと同じくらい安全です。つまり、クライアント上で安全なものは何もありません。それはそこにある野生の西です。ユーザーが保護されたくない場合、ユーザーを自分自身から保護することはできません。

そうは言っても、一般的に物事を成し遂げるためのより良い方法がありますeval()。ほとんどいつも。

于 2012-06-22T18:57:20.967 に答える
1

eval() はどれくらい安全ですか?

まったく安全ではありません。

JavaScript の eval 関数を使用するのが悪い考えなのはなぜですか?

于 2012-06-22T18:51:40.103 に答える
0

このeval()関数を使用すると、攻撃者がjavascriptをサイトに挿入した場合、eval関数内であらゆる種類の不正なコードを実行できる可能性があります。

于 2012-06-22T18:54:32.393 に答える
0

いいえ、実行するコードやその他のものを操作するのは簡単です。さらに、評価は物事を機能させるための良い方法ではありません

于 2012-06-22T18:51:06.377 に答える