可能であれば避けるべき一般的なルールは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.origin
WebKit でのみ利用できるようですが、回避策は次のとおりです。
if (!window.location.hasOwnProperty("origin")) {
window.location.origin = window.location.protocol + "//" + window.location.host;
}