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を除外できます。Firefoxなどのブラウザではdocument.domainを完全にエイリアンドメインに変更できないため、この方法はクロスドメインリソースには適していません。
ソース:https : //developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Cross-Origin Resource Sharingメソッド
クロスオリジンリソースシェアリング(CORS)は、W3Cワーキングドラフトであり、オリジン全体でソースにアクセスするときにブラウザとサーバーが通信する方法を定義しています。CORSの背後にある基本的な考え方は、カスタムHTTPヘッダーを使用して、ブラウザーとサーバーの両方が互いについて十分に認識し、要求または応答が成功するか失敗するかを判断できるようにすることです。
シンプルなリクエストの場合、カスタムヘッダーのいずれGETかPOSTを使用するか、または使用せず、本文がtext/plainであるリクエストは、という追加のヘッダーとともに送信されOriginます。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>
ウィンドウは、ウィンドウ内のドキュメントの場所に関係なく、いつでも他のウィンドウのこのメソッドにアクセスしてメッセージを送信できます。したがって、メッセージの受信に使用されるイベントリスナーは、最初に、起点とソースのプロパティを使用して、メッセージの送信者のIDを確認する必要があります。これは控えめに言っても過言ではありません。プロパティのチェックに失敗するoriginと、場合によってはsourceプロパティがクロスサイトスクリプト攻撃を有効にします。
ソース:https : //developer.mozilla.org/en/DOM/window.postMessage