Kebijakan asal yang sama
Anda tidak dapat mengakses <iframe>
dengan asal yang berbeda menggunakan JavaScript, itu akan menjadi kelemahan keamanan yang sangat besar jika Anda bisa melakukannya. Untuk browser kebijakan asal yang sama, blokir skrip yang mencoba mengakses bingkai dengan asal yang berbeda .
Asal dianggap berbeda jika setidaknya salah satu bagian alamat berikut ini tidak dikelola:
<protocol>://<hostname>:<port>/...
Protokol , nama host , dan port harus sama dengan domain Anda, jika Anda ingin mengakses sebuah bingkai.
CATATAN: Internet Explorer diketahui tidak sepenuhnya mengikuti aturan ini, lihat di sini untuk detailnya.
Contohnya
Inilah yang akan terjadi ketika mencoba mengakses URL berikut dari 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
Penanganan masalah
Meskipun kebijakan yang sama-asal memblokir skrip untuk mengakses konten situs dengan asal yang berbeda, jika Anda memiliki kedua halaman, Anda dapat mengatasi masalah ini menggunakan window.postMessage
dan message
kejadian relatifnya untuk mengirim pesan antara dua halaman, seperti ini:
Di halaman utama Anda:
let frame = document.getElementById('your-frame-id');
frame.contentWindow.postMessage(/*any variable or object here*/, 'http://your-second-site.com');
Argumen kedua untuk postMessage()
dapat '*'
menunjukkan tidak ada preferensi tentang asal tujuan. Asal target harus selalu disediakan bila memungkinkan, untuk menghindari pengungkapan data yang Anda kirim ke situs lain.
Di <iframe>
(terkandung di halaman utama) Anda:
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;
}
});
Metode ini dapat diterapkan di kedua arah , membuat pendengar di halaman utama juga, dan menerima tanggapan dari bingkai. Logika yang sama juga dapat diimplementasikan dalam pop-up dan pada dasarnya setiap jendela baru yang dihasilkan oleh halaman utama (misalnya menggunakan window.open()
) juga, tanpa perbedaan apa pun.
Menonaktifkan kebijakan yang sama-asal pada browser Anda
Sudah ada beberapa jawaban bagus tentang topik ini (saya baru saja menemukan mereka googling), jadi, untuk browser yang memungkinkan, saya akan menautkan jawaban relatif. Namun, harap diingat bahwa menonaktifkan kebijakan asal yang sama hanya akan memengaruhi browser Anda . Selain itu, menjalankan peramban dengan pengaturan keamanan asal-sama yang dinonaktifkan memberikan akses situs web apa pun ke sumber daya lintas-asal, sehingga sangat tidak aman dan TIDAK PERNAH dilakukan jika Anda tidak tahu persis apa yang Anda lakukan (mis. Tujuan pengembangan) .
Access-Control-Allow-Origin
tidak berlaku untuk iFrames, hanya untuk XHRs, Fonts, WebGL dancanvas.drawImage
. Saya percayapostMessage
adalah satu-satunya pilihan.