Kebijakan asal yang sama
Saya ingin membuat wiki komunitas tentang kebijakan yang sama asal HTML / JS untuk semoga membantu siapa pun yang mencari topik ini. Ini adalah salah satu topik yang paling dicari di SO dan tidak ada wiki yang dikonsolidasikan untuk itu jadi di sini saya lanjutkan :)
Kebijakan asal yang sama mencegah dokumen atau skrip yang diambil dari satu sumber dari mendapatkan atau mengatur properti dokumen dari sumber lain. Kebijakan ini berlaku sejak Netscape Navigator 2.0.
Apa beberapa cara favorit Anda untuk berkeliling di kebijakan yang sama-asal?
Harap simpan contoh-contoh dengan bertele-tele dan sebaiknya tautkan sumber Anda.
javascript
ajax
same-origin-policy
David Titarenco
sumber
sumber
not constructive
tag tampaknya benar-benar gila. Memilih untuk membuka kembali.Jawaban:
The
document.domain
metodePerhatikan bahwa ini adalah metode iframe yang menetapkan nilai document.domain ke sufiks domain saat ini. Jika melakukannya, domain yang lebih pendek digunakan untuk pemeriksaan asal berikutnya. Misalnya, asumsikan skrip dalam dokumen di
http://store.company.com/dir/other.html
jalankan pernyataan berikut:Setelah pernyataan itu dieksekusi, halaman akan melewati pemeriksaan asal dengan
http://company.com/dir/page.html
. Namun, dengan alasan yang sama, company.com tidak dapat diaturdocument.domain
keothercompany.com
.Dengan metode ini, Anda akan diizinkan untuk mengeksekusi javascript dari iframe yang bersumber pada subdomain pada halaman yang bersumber pada domain utama. Metode ini tidak cocok untuk sumber daya lintas-domain karena browser seperti Firefox tidak akan memungkinkan Anda untuk mengubah
document.domain
ke domain yang sepenuhnya asing.Sumber: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Metode Berbagi Sumber Daya Silang-Asal
Cross-Origin Resource Sharing (CORS) adalah W3C Working Draft yang mendefinisikan bagaimana browser dan server harus berkomunikasi ketika mengakses sumber di seluruh asal. Gagasan dasar di balik CORS adalah menggunakan header HTTP khusus untuk memungkinkan browser dan server mengetahui cukup banyak tentang satu sama lain untuk menentukan apakah permintaan atau respons harus berhasil atau gagal.
Untuk permintaan sederhana, permintaan yang menggunakan salah satu
GET
atauPOST
tanpa tajuk khusus dan yang badannya adalahtext/plain
, permintaan dikirim dengan tajuk tambahan yang disebutOrigin
. Header Asal berisi asal (protokol, nama domain, dan port) dari halaman yang meminta sehingga server dapat dengan mudah menentukan apakah harus melayani respons atau tidak. ContohOrigin
tajuk mungkin terlihat seperti ini:Jika server memutuskan bahwa permintaan harus diizinkan, ia mengirim
Access-Control-Allow-Origin
header yang menggemakan asal yang sama dengan yang dikirim atau*
jika itu adalah sumber daya publik. Sebagai contoh:Jika tajuk ini tidak ada, atau asal-usulnya tidak cocok, maka peramban tidak mengizinkannya. Jika semuanya baik-baik saja, maka browser memproses permintaan. Perhatikan bahwa baik permintaan maupun respons tidak menyertakan informasi cookie.
Tim Mozilla menyarankan dalam posting mereka tentang CORS bahwa Anda harus memeriksa keberadaan
withCredentials
properti untuk menentukan apakah browser mendukung CORS melalui XHR. Anda kemudian dapat berpasangan dengan keberadaanXDomainRequest
objek untuk menutupi semua browser:Perhatikan bahwa agar metode CORS berfungsi, Anda harus memiliki akses ke semua jenis mekanisme header server dan tidak bisa begitu saja mengakses sumber daya pihak ketiga.
Sumber: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
The
window.postMessage
metodewindow.postMessage
, ketika dipanggil, menyebabkan aMessageEvent
untuk dikirim di jendela target ketika skrip yang tertunda yang harus dieksekusi selesai (misalnya penangan peristiwa yang tersisa jikawindow.postMessage
dipanggil dari penangan peristiwa, batas waktu pending yang ditetapkan sebelumnya, dll.). TheMessageEvent
memiliki pesan jenis, sebuahdata
properti yang diatur ke nilai string dari argumen pertama yang diberikan kepadawindow.postMessage
, sebuahorigin
properti yang sesuai dengan asal-usul dokumen utama di jendela meneleponwindow.postMessage
pada waktu ituwindow.postMessage
disebut, dansource
properti yang jendela dari yangwindow.postMessage
disebut.Untuk menggunakan
window.postMessage
, pendengar acara harus dilampirkan:Dan suatu
receiveMessage
fungsi harus dinyatakan:Iframe luar-situs juga harus mengirim acara dengan benar melalui
postMessage
:Jendela apa pun dapat mengakses metode ini di jendela lain, kapan saja, apa pun lokasi dokumen di jendela itu, untuk mengirimkannya pesan. Akibatnya, pendengar acara apa pun yang digunakan untuk menerima pesan harus terlebih dahulu memeriksa identitas pengirim pesan, menggunakan asal dan kemungkinan sumber properti. Ini tidak dapat dikecilkan: Kegagalan untuk memeriksa
origin
dan mungkinsource
properti memungkinkan serangan skrip lintas situs.Sumber: https://developer.mozilla.org/en/DOM/window.postMessage
sumber
Access-Control-Allow-Origin: http://www.stackoverflow.com/
alih-alih:Access-Control-Allow-Origin: http://www.stackoverflow.com
(memangkas di akhir url), itu tidak berfungsi di Safari dan FF tetapi bekerja di Chrome. Tentu saja tanpa slash berfungsi dengan baik di semua browser.postMessage
metode ini hanya berfungsi untuk browser yang mendukungnya, karena ini merupakan tambahan HTML5. Plugin ini mencoba menjelaskannya. Sebut saja karena saya belajar ini dengan cara yang sulit.Metode Reverse Proxy
Menyiapkan proxy terbalik sederhana di server, akan memungkinkan browser untuk menggunakan jalur relatif untuk permintaan Ajax, sementara server akan bertindak sebagai proxy ke lokasi jauh.
Jika menggunakan mod_proxy di Apache, arahan konfigurasi mendasar untuk mengatur proxy terbalik adalah
ProxyPass
. Biasanya digunakan sebagai berikut:Dalam hal ini, browser akan dapat meminta
/ajax/web_service.xml
sebagai URL relatif, tetapi server akan melayani ini dengan bertindak sebagai proxy untukhttp://other-domain.com/ajax/web_service.xml
.Salah satu fitur menarik dari metode ini adalah bahwa proxy terbalik dapat dengan mudah mendistribusikan permintaan ke beberapa back-end, sehingga bertindak sebagai penyeimbang beban .
sumber
Saya menggunakan JSONP.
Pada dasarnya, Anda menambahkan
di halaman Anda.
some_func () harus dipanggil agar Anda diberi tahu bahwa datanya ada.
sumber
AnyOrigin tidak berfungsi dengan baik dengan beberapa situs https, jadi saya hanya menulis alternatif open source bernama whateverorigin.org yang tampaknya berfungsi baik dengan https.
Kode di github .
sumber
Cara terbaru untuk mengatasi kebijakan asal-sama yang saya temukan adalah http://anyorigin.com/
Situs ini dibuat sehingga Anda hanya memberikan url apa pun dan menghasilkan kode javascript / jquery untuk Anda yang memungkinkan Anda mendapatkan html / data, terlepas dari asalnya. Dengan kata lain, itu membuat url atau halaman web permintaan JSONP.
Saya merasa cukup berguna :)
Berikut beberapa contoh kode javascript dari anyorigin:
sumber
Saya tidak bisa mengklaim kredit untuk gambar ini, tetapi cocok dengan semua yang saya tahu tentang hal ini dan menawarkan sedikit humor pada saat yang sama.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
sumber
The JSONP datang ke pikiran:
sumber
Secara pribadi,
window.postMessage
adalah cara paling andal yang saya temukan untuk peramban modern. Anda harus melakukan sedikit lebih banyak pekerjaan untuk memastikan Anda tidak membiarkan diri Anda terbuka terhadap serangan XSS, tetapi itu adalah tradeoff yang masuk akal.Ada juga beberapa plugin untuk toolkit Javascript populer di luar sana yang membungkus
window.postMessage
yang menyediakan fungsionalitas yang mirip dengan browser lama menggunakan metode lain yang dibahas di atas.sumber
Yah, saya menggunakan curl di PHP untuk menghindari ini. Saya memiliki layanan web yang berjalan di port 82.
Berikut adalah javascript yang melakukan panggilan ke file PHP
HTML saya berjalan di WAMP di port 80. Jadi begini, kebijakan asal yang sama telah dielakkan :-)
sumber
Berikut adalah beberapa solusi dan penjelasan tentang kebijakan asal yang sama:
Blog Thiru - Browser solusi kebijakan asal yang sama
sumber
Ini menganalisis cukup banyak apa yang tersedia di luar sana: http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
Untuk solusi postMessage lihat:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
dan versi yang sedikit berbeda:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js
sumber