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