นโยบายแหล่งกำเนิดเดียวกัน
คุณไม่สามารถเข้าถึง<iframe>
ด้วยต้นกำเนิดที่แตกต่างกันโดยใช้ JavaScript มันจะเป็นข้อบกพร่องด้านความปลอดภัยขนาดใหญ่ถ้าคุณสามารถทำได้ สำหรับเดียวกันกำเนิดนโยบาย เบราว์เซอร์กันโดยสคริปต์พยายามเข้าถึงกรอบที่มีต้นกำเนิดที่แตกต่างกัน
Origin ถือว่าแตกต่างกันหากที่อยู่อย่างน้อยหนึ่งส่วนต่อไปนี้ของที่อยู่ไม่ได้รับการปรับปรุง:
<protocol>://<hostname>:<port>/...
โพรโทคอ , ชื่อโฮสต์และพอร์ตจะต้องเหมือนกันโดเมนของคุณถ้าคุณต้องการที่จะเข้าถึงกรอบ
หมายเหตุ: Internet Explorer ไม่ได้ปฏิบัติตามกฎนี้อย่างเคร่งครัดดูรายละเอียดที่นี่
ตัวอย่าง
นี่คือสิ่งที่จะเกิดขึ้นพยายามเข้าถึง URL ต่อไปนี้จาก http://www.example.com/home/index.html
URL RESULT
http://www.example.com/home/other.html -> Success
http://www.example.com/dir/inner/another.php -> Success
http://www.example.com:80 -> Success (default port for HTTP)
http://www.example.com:2251 -> Failure: different port
http://data.example.com/dir/other.html -> Failure: different hostname
https://www.example.com/home/index.html:80 -> Failure: different protocol
ftp://www.example.com:21 -> Failure: different protocol & port
https://google.com/search?q=james+bond -> Failure: different protocol, port & hostname
วิธีแก้ปัญหา
แม้ว่านโยบายที่มาดั้งเดิมบล็อกสคริปต์จากการเข้าถึงเนื้อหาของเว็บไซต์ที่มีต้นกำเนิดที่แตกต่างกันหากคุณเป็นเจ้าของทั้งสองหน้าคุณสามารถแก้ไขปัญหานี้โดยใช้window.postMessage
และmessage
เหตุการณ์ที่เกี่ยวข้องเพื่อส่งข้อความระหว่างสองหน้าดังนี้:
ในหน้าหลักของคุณ:
let frame = document.getElementById('your-frame-id');
frame.contentWindow.postMessage(/*any variable or object here*/, 'http://your-second-site.com');
อาร์กิวเมนต์ที่สองที่postMessage()
สามารถใช้'*'
เพื่อระบุว่าไม่มีการตั้งค่าเกี่ยวกับที่มาของปลายทาง ควรให้แหล่งกำเนิดเป้าหมายเมื่อเป็นไปได้เสมอเพื่อหลีกเลี่ยงการเปิดเผยข้อมูลที่คุณส่งไปยังเว็บไซต์อื่น
ในของคุณ<iframe>
(อยู่ในหน้าหลัก):
window.addEventListener('message', event => {
// IMPORTANT: check the origin of the data!
if (event.origin.startsWith('http://your-first-site.com')) {
// The data was sent from your site.
// Data sent with postMessage is stored in event.data:
console.log(event.data);
} else {
// The data was NOT sent from your site!
// Be careful! Do not use it. This else branch is
// here just for clarity, you usually shouldn't need it.
return;
}
});
วิธีนี้สามารถใช้ได้ทั้งสองทิศทางสร้างผู้ฟังในหน้าหลักด้วยและรับการตอบกลับจากเฟรม ตรรกะเดียวกันนี้ยังสามารถนำมาใช้ในป๊อปอัปและโดยทั่วไปหน้าต่างใหม่ที่สร้างโดยหน้าหลัก (เช่นใช้window.open()
) เช่นกันโดยไม่มีความแตกต่าง
ปิดการใช้งานนโยบายกำเนิดเดียวกันในเบราว์เซอร์ของคุณ
มีคำตอบที่ดีเกี่ยวกับหัวข้อนี้อยู่แล้ว (ฉันเพิ่งพบพวกเขา googling) ดังนั้นสำหรับเบราว์เซอร์ที่เป็นไปได้ฉันจะเชื่อมโยงคำตอบที่เกี่ยวข้อง อย่างไรก็ตามโปรดจำไว้ว่าการปิดใช้งานนโยบายต้นทางเดียวกันจะส่งผลต่อเบราว์เซอร์ของคุณเท่านั้น นอกจากนี้การทำงานของเบราเซอร์ที่มีต้นกำเนิดเดียวกันตั้งค่าความปลอดภัยเงินอุดหนุนผู้พิการใด ๆการเข้าถึงเว็บไซต์ที่ทรัพยากรข้ามกำเนิดดังนั้นมันเป็นเรื่องที่ไม่ปลอดภัยมากและไม่ควรทำถ้าคุณไม่ได้รู้ว่าสิ่งที่คุณกำลังทำ (เช่นเพื่อการพัฒนา)
Access-Control-Allow-Origin
ใช้ไม่ได้กับ iFrames เท่านั้นที่จะXHRscanvas.drawImage
แบบอักษรและ ฉันเชื่อว่าpostMessage
เป็นตัวเลือกเดียว