Pengembangan web sering membutuhkan masalah silang domain. Akar penyebab masalah lintas domain adalah strategi yang sama-orisinal dalam keamanan browser. Misalnya, untuk http://www.a.com/1.html:
1. Http://www.a.com/2.html homolog;
2. Https://www.a.com/2.html berasal dari sumber yang berbeda, karena protokolnya berbeda;
3. Http://www.a.com:8080/2.html berasal dari sumber yang berbeda, karena port berbeda;
4. Http://sub.a.com/2.html berasal dari sumber yang berbeda karena host berbeda.
Di browser, tag <script>, <mmg>, <frame> dan <link> dapat memuat sumber daya domain lintas (non-homolog), dan metode pemuatan sebenarnya setara dengan permintaan GET biasa. Satu -satunya perbedaan adalah bahwa demi keamanan, browser tidak mengizinkan operasi membaca dan menulis pada sumber daya yang dimuat dengan cara ini, tetapi hanya dapat menggunakan kemampuan yang seharusnya dimiliki tag itu sendiri (seperti eksekusi skrip, aplikasi gaya, dll.).
Masalah lintas domain yang paling umum adalah masalah akses lintas domain AJAX. Secara default, URL domain silang tidak dapat diakses melalui AJAX. Di sini saya merekam apa yang telah saya pelajari tentang metode lintas domain:
1. Proxy sisi server , tidak ada yang bisa dikatakan. Kerugiannya adalah bahwa secara default, server yang menerima permintaan AJAX tidak dapat memperoleh IP dan UA klien.
2. IFRAME , menggunakan IFRAME sebenarnya setara dengan membuka halaman web baru. Metode lintas-domain spesifik kira-kira halaman induk yang dibuka oleh domain sebuah sarang iframe menunjuk ke domain B, dan kemudian mengirimkan data. Setelah selesai, server B dapat:
● Mengembalikan respons pengalihan 302 dan mengarahkan hasilnya kembali ke domain A;
● Sarang iframe yang menunjuk ke domain A di dalam iframe ini.
Keduanya akhirnya menerapkan panggilan lintas domain. Metode ini lebih kuat secara fungsional daripada JSONP yang diperkenalkan di bawah ini, karena setelah penyelesaian lintas domain, tidak ada masalah dengan operasi DOM dan panggilan JavaScript antara satu sama lain, tetapi ada beberapa batasan, seperti hasil yang disahkan dalam parameter URL, yang berarti bahwa ketika data hasilnya besar, perlu disahkan dalam segmentasi, yang sangat sulit; Ada masalah lain yang disebabkan oleh iframe itu sendiri, dan interaksi antara halaman induk dan iframe itu sendiri memiliki batasan keamanan.
3. Gunakan tag skrip untuk domain silang , metode ini juga sangat umum. Tag skrip dapat memuat javascript asing dan menjalankannya. Fungsi panggilan balik yang telah ditetapkan sebelumnya dapat mewujudkan interaksi dengan halaman induk. Ini memiliki nama besar yang disebut JSONP Cross-Domain, yang merupakan singkatan dari JSON dengan padding. Ini adalah protokol tidak resmi, yang jelas memuat skrip, jadi mengapa itu terkait dengan JSON? Ternyata ini adalah fungsi panggilan balik ini. Ada cara khas untuk menggunakannya, yaitu untuk melewati parameter melalui JSON, yaitu, isi data JSON ke dalam fungsi callback. Inilah arti dari JSON+Padding JSONP.
Ada banyak layanan JSONP di Internet untuk menyediakan data. Intinya, mereka adalah permintaan lintas domain dan menentukan panggilan balik dalam URL permintaan, seperti callback = hasil. Setelah mendapatkan data ini, fungsi hasil akan dipanggil secara otomatis dan data akan dilewati dalam bentuk JSON, misalnya (cari "sepak bola"):
http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=Result
Gunakan jQuery untuk menyebutnya dan menulisnya sebagai:
Salinan kode adalah sebagai berikut:
$ .getjson ("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=football&callback=?", function (data) {
// ...
});
Secara umum, batasan pendekatan domain silang JSONP adalah bahwa ia hanya dapat menggunakan permintaan GET dan tidak dapat menyelesaikan masalah bagaimana membuat panggilan JavaScript antara dua halaman di berbagai domain.
4. Flash Cross-Domain:
Ini akan mengakses file crossdomain.xml di bawah direktori root dari situs web target, dan menentukan apakah akan mengizinkan akses domain silang ini berdasarkan konten dalam file:
Salinan kode adalah sebagai berikut:
<Cross-domain-policy>
<allow-access-from domain = "xxx.xxx.com" />
</cross-domain-policy>
5. Tag IMG juga dapat digunakan , yang juga merupakan metode yang sangat umum. Ini memiliki fungsi yang lebih lemah dan hanya dapat mengirim permintaan GET tanpa panggilan balik. Beginilah cara klik Google ditentukan.
6. Window.PostMessage, yang merupakan mekanisme yang baru ditambahkan untuk komunikasi lintas domain, hanya didukung oleh Firefox 3, Safari 4, IE8 dan versi yang lebih baru. Panggilan untuk menggunakannya untuk mengirim pesan ke jendela lain adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
OtherWindow.PostMessage (pesan, targetorigin);
Di jendela penerima, penangan acara perlu diatur untuk menerima pesan yang dikirim:
Salinan kode adalah sebagai berikut:
window.addeventlistener ("pesan", penerima, false);
function recequemessage (event) {
if (event.orgin! == "http://example.org:8080")
kembali;
}
Perhatikan bahwa atribut asal dan sumber dari pesan harus digunakan untuk memverifikasi identitas pengirim, jika tidak itu akan menyebabkan kerentanan XSS.
7. Kontrol akses
Beberapa browser mendukung header respons seperti akses-kontrol-awal-asal, seperti:
Salinan kode adalah sebagai berikut:
header ("Access-Control-Allow-origin: http://www.a.com");
Ini menentukan bahwa akses lintas domain ke www.a.com diizinkan.
8. Window.name
Hal ini sebenarnya digunakan sebagai sarana untuk meretas XSS. Essensinya adalah bahwa ketika lokasi jendela berubah, halaman akan dimuat ulang, tetapi yang menarik, jendela. Nama tidak berubah, sehingga Anda dapat menggunakannya untuk memberikan nilainya. Dengan iframe, ubah objek jendela dari iframe beberapa kali, dan transfer data lintas domain praktis selesai.
9. Dokumen.Domain
Metode ini cocok untuk komunikasi lintas-domain seperti A.example.com dan b.example.com, karena keduanya memiliki domain umum yang disebut example.com. Cukup atur document.domain ke example.com, tetapi jika Anda ingin berkomunikasi antara A.example1.com dan b.example2.com, ia tidak punya pilihan.
10. Fragment Identitier Messaging (FIM)
Metode ini sangat menarik dan membutuhkan kerja sama iframe. Fragment Identitier adalah bagian yang sering digunakan untuk penentuan posisi jangkar setelah tanda pound URL (#). Perubahan bagian ini tidak akan menyebabkan refresh halaman. Jendela wanita dapat mengakses URL iframe sesuka hati, dan iframe juga dapat mengakses URL jendela wanita. Maka komunikasi dapat dicapai dengan mengubah pengidentifikasi fragmement. Kerugiannya adalah bahwa perubahan dalam pengidentifikasi fragmement akan menghasilkan sejarah yang tidak perlu dan memiliki batasan panjang; Selain itu, beberapa browser tidak mendukung acara OnHashChange.
11. Bingkai silang (CF)
Metode ini adalah varian dari metode FIM di atas. Inti dari CF dan FIM sebenarnya diperkenalkan dalam artikel saya "GWT First Experience" (hanya digunakan untuk menerapkan sejarah dan fungsi mundur). Ini akan secara dinamis membuat iframe yang tidak terlihat, menunjuk ke domain asing. Setelah diproses, fragmen yang diidentifikasi dalam URL iframe ini berisi hasil pemrosesan untuk diakses halaman induk, sedangkan URL browser tidak memiliki perubahan.
12. Protokol Cookie+P3P
Menggunakan karakteristik cookie akses lintas domain di bawah protokol P3P untuk mencapai akses lintas domain juga merupakan trik yang aneh. P3P adalah standar rekomendasi perlindungan privasi yang dirilis oleh W3C, yang bertujuan untuk memberikan perlindungan privasi bagi pengguna internet yang menjelajahi Internet. Atur jalur cookie ke "/", yaitu, tidak ada batasan domain. Pada saat ini, beberapa browser memungkinkan halaman URL lain dibaca, sementara yang lain tidak. Dalam hal ini, header P3P perlu ditetapkan pada kepala respons halaman induk:
Salinan kode adalah sebagai berikut:
P3p: cp = "cura adma deva psao psdo bus uni pur int sta pre com nav otc noi dsp cor"