document.domain
วิธี
โปรดทราบว่านี่เป็นวิธี iframe ที่ตั้งค่า document.domain เป็นส่วนต่อท้ายของโดเมนปัจจุบัน หากเป็นเช่นนั้นโดเมนที่สั้นกว่าจะถูกใช้สำหรับการตรวจสอบต้นฉบับ ตัวอย่างเช่นสมมติว่าสคริปต์ในเอกสารที่http://store.company.com/dir/other.html
ดำเนินการคำสั่งต่อไปนี้:
document.domain = "company.com";
http://company.com/dir/page.html
หลังจากนั้นรันคำสั่งหน้าจะผ่านการตรวจสอบแหล่งที่มาด้วย แต่ด้วยเหตุผลเดียวกัน company.com อาจไม่ได้ตั้งค่าการdocument.domain
othercompany.com
ด้วยวิธีนี้คุณจะได้รับอนุญาตให้ออกจากจาวาสคริปต์จาก iframe ที่มาจากโดเมนย่อยบนหน้าเว็บที่มาจากโดเมนหลัก วิธีนี้ไม่เหมาะสำหรับทรัพยากรข้ามโดเมนเนื่องจากเบราว์เซอร์เช่น Firefox จะไม่อนุญาตให้คุณเปลี่ยนdocument.domain
ไปเป็นโดเมนต่างด้าวทั้งหมด
ที่มา: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
วิธีการใช้ทรัพยากรร่วมกันข้ามแหล่งกำเนิด
การแบ่งปันทรัพยากรข้ามแหล่งกำเนิด (CORS) เป็น W3C Working Draft ที่กำหนดวิธีที่เบราว์เซอร์และเซิร์ฟเวอร์ต้องสื่อสารเมื่อเข้าถึงแหล่งข้อมูลข้ามแหล่งกำเนิด แนวคิดพื้นฐานเบื้องหลัง 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
หากส่วนหัวนี้หายไปหรือต้นกำเนิดไม่ตรงกันเบราว์เซอร์จะปิดการร้องขอ หากทุกอย่างเรียบร้อยเบราว์เซอร์จะดำเนินการตามคำขอ โปรดทราบว่าคำขอหรือคำตอบไม่รวมถึงข้อมูลคุกกี้
ทีมงาน Mozilla แนะนำในโพสต์เกี่ยวกับ CORSว่าคุณควรตรวจสอบการมีอยู่ของwithCredentials
คุณสมบัติเพื่อดูว่าเบราว์เซอร์รองรับ CORS ผ่าน XHR หรือไม่ จากนั้นคุณสามารถจับคู่กับการมีอยู่ของ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
เมื่อเรียกจะทำให้ a MessageEvent
ถูกส่งไปที่หน้าต่างเป้าหมายเมื่อสคริปต์ที่รอดำเนินการใด ๆ ที่ต้องดำเนินการเสร็จสมบูรณ์ (เช่นตัวจัดการเหตุการณ์ที่เหลืออยู่หากwindow.postMessage
ถูกเรียกจากตัวจัดการเหตุการณ์ MessageEvent
มีข้อความชนิดมีdata
คุณสมบัติที่ถูกกำหนดให้เป็นค่าสตริงของอาร์กิวเมนต์แรกให้กับwindow.postMessage
การorigin
คุณสมบัติที่สอดคล้องกับที่มาของเอกสารหลักในหน้าต่างการเรียกwindow.postMessage
ในเวลาที่window.postMessage
ถูกเรียกและsource
ทรัพย์สินซึ่งเป็นหน้าต่างจาก ซึ่งwindow.postMessage
เรียกว่า
วิธีใช้window.postMessage
ต้องแนบ listener เหตุการณ์:
// 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
คุณสมบัติที่เป็นไปได้ทำให้เกิดการโจมตีสคริปต์ข้ามไซต์
ที่มา: https://developer.mozilla.org/en/DOM/window.postMessage