document.domain
方法_
これは、document.domain の値を現在のドメインのサフィックスに設定する iframe メソッドであることに注意してください。その場合、短い方のドメインが後続のオリジン チェックに使用されます。たとえば、ドキュメント内のスクリプトがhttp://store.company.com/dir/other.html
次のステートメントを実行するとします。
document.domain = "company.com";
そのステートメントが実行された後、ページは でオリジン チェックに合格しhttp://company.com/dir/page.html
ます。ただし、同じ理由で、company.com を に設定できませんでしdocument.domain
たothercompany.com
。
この方法を使用すると、サブドメインをソースとする iframe から、メイン ドメインをソースとするページで javascript を実行できます。document.domain
Firefox などのブラウザでは完全に異質なドメインに変更できないため、この方法はクロスドメイン リソースには適していません。
ソース: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Cross-Origin Resource Sharing メソッド
Cross-Origin Resource Sharing (CORS) は W3C ワーキング ドラフトであり、オリジン間でソースにアクセスするときにブラウザーとサーバーがどのように通信する必要があるかを定義しています。CORS の背後にある基本的な考え方は、カスタム HTTP ヘッダーを使用して、ブラウザーとサーバーの両方が互いを十分に認識し、要求または応答が成功するか失敗するかを判断できるようにすることです。
カスタム ヘッダーを使用するか使用せず、本文がGET
である単純なリクエストの場合、リクエストは と呼ばれる追加のヘッダーとともに送信されます。Origin ヘッダーには、要求元のページのオリジン (プロトコル、ドメイン名、およびポート) が含まれているため、サーバーは応答を提供する必要があるかどうかを簡単に判断できます。ヘッダーの例は次のようになります。POST
text/plain
Origin
Origin
Origin: http://www.stackoverflow.com
サーバーは、リクエストを許可する必要があると判断した場合、送信されたのと同じオリジン、またはそれがパブリック リソースである場合にAccess-Control-Allow-Origin
、エコー バックするヘッダーを送信します。*
例えば:
Access-Control-Allow-Origin: http://www.stackoverflow.com
このヘッダーがない場合、またはオリジンが一致しない場合、ブラウザはリクエストを許可しません。すべてが正常であれば、ブラウザはリクエストを処理します。リクエストにもレスポンスにも Cookie 情報は含まれないことに注意してください。
Mozilla チームは、CORS に関する投稿で、プロパティの存在を確認してwithCredentials
、ブラウザが XHR 経由で CORS をサポートしているかどうかを判断するよう提案しています。次に、オブジェクトの存在と組み合わせて、XDomainRequest
すべてのブラウザーをカバーできます。
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
CORS メソッドが機能するには、任意のタイプのサーバー ヘッダー メカニズムにアクセスする必要があり、サードパーティのリソースに単純にアクセスすることはできないことに注意してください。
ソース: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
window.postMessage
方法_
window.postMessage
が呼び出されると、MessageEvent
実行する必要がある保留中のスクリプトが完了すると、ターゲット ウィンドウで がディスパッチされます (たとえばwindow.postMessage
、イベント ハンドラから が呼び出された場合の残りのイベント ハンドラ、以前に設定された保留中のタイムアウトなど)。にMessageEvent
は、タイプ メッセージ、 にdata
提供される最初の引数の文字列値に設定されるプロパティ、呼び出された時点でウィンドウ呼び出しのメイン ドキュメントの起点に対応するプロパティwindow.postMessage
、およびウィンドウからのプロパティがあります。と呼ばれます。origin
window.postMessage
window.postMessage
source
window.postMessage
を使用するwindow.postMessage
には、イベント リスナーをアタッチする必要があります。
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
そして、receiveMessage
関数を宣言する必要があります:
function receiveMessage(event)
{
// do something with event.data;
}
オフサイト iframe は、以下を介してイベントを適切に送信する必要もありますpostMessage
。
<script>window.parent.postMessage('foo','*')</script>
どのウィンドウでも、ウィンドウ内のドキュメントの場所に関係なく、他のウィンドウのこのメソッドにいつでもアクセスして、メッセージを送信できます。したがって、メッセージの受信に使用されるすべてのイベント リスナーは、origin プロパティと場合によっては source プロパティを使用して、メッセージの送信者の ID を最初に確認する必要があります。これは控えめに言っても過言ではありません。プロパティをチェックしないと、クロスサイト スクリプティング攻撃が可能になりますorigin
。source
ソース: https://developer.mozilla.org/en/DOM/window.postMessage