Rupanya, saya benar-benar salah memahami semantiknya. Saya memikirkan sesuatu seperti ini:
- Seorang klien mengunduh kode javascript MyCode.js dari
http://siteA
- asal . - Header respons MyCode.js berisi Access-Control-Allow-Origin
http://siteB
:, yang menurut saya berarti bahwa MyCode.js diizinkan membuat referensi lintas-asal ke situs B. - Klien memicu beberapa fungsionalitas MyCode.js, yang pada gilirannya membuat permintaan
http://siteB
, yang seharusnya baik-baik saja, meskipun permintaan lintas-asal.
Ya saya salah. Sama sekali tidak bekerja seperti ini. Jadi, saya telah membaca cross-origin resource sharing dan berusaha membaca Cross-Origin Resource Sharing dalam rekomendasi w3c
Satu hal yang pasti - saya masih tidak mengerti bagaimana saya bisa menggunakan header ini.
Saya memiliki kontrol penuh atas situs A dan situs B. Bagaimana cara mengaktifkan kode javascript yang diunduh dari situs A untuk mengakses sumber daya di situs B menggunakan header ini?
PS
Saya tidak ingin menggunakan JSONP.
javascript
cross-domain
cors
menandai
sumber
sumber
http://siteA/MyCode.js
.Jawaban:
Access-Control-Allow-Origin
adalah tajuk CORS (Cross-Origin Resource Sharing) .Ketika Situs A mencoba untuk mengambil konten dari Situs B, Situs B dapat mengirim
Access-Control-Allow-Origin
header tanggapan untuk memberi tahu browser bahwa konten halaman ini dapat diakses oleh asal tertentu. ( Asal adalah domain, ditambah skema dan nomor port .) Secara default, halaman Situs B tidak dapat diakses oleh asal lain ; menggunakanAccess-Control-Allow-Origin
header membuka pintu untuk akses lintas-asal dengan asal-usul permintaan yang spesifik.Untuk setiap sumber daya / halaman yang ingin diakses Situs B untuk Situs A, Situs B harus melayani halaman-halamannya dengan tajuk respons:
Browser modern tidak akan langsung memblokir permintaan lintas domain. Jika Situs A meminta halaman dari Situs B, browser akan benar-benar mengambil halaman yang diminta pada tingkat jaringan dan memeriksa apakah header responsnya mendaftar Situs A sebagai domain pemohon yang diizinkan. Jika Site B belum mengindikasikan bahwa Situs A diperbolehkan untuk mengakses halaman ini, browser akan memicu
XMLHttpRequest
'serror
acara dan menyangkal data respon terhadap kode JavaScript meminta.Permintaan tidak sederhana
Apa yang terjadi pada tingkat jaringan bisa sedikit lebih kompleks daripada yang dijelaskan di atas. Jika permintaan tersebut adalah permintaan "tidak sederhana" , browser pertama-tama mengirimkan permintaan OPSI "preflight" tanpa data, untuk memverifikasi bahwa server akan menerima permintaan tersebut. Permintaan tidak sederhana ketika salah satu (atau keduanya):
Accept
Accept-Language
Content-Language
Content-Type
(ini hanya sederhana jika nilainyaapplication/x-www-form-urlencoded
,multipart/form-data
atautext/plain
)Jika server menanggapi preflight OPSI dengan tajuk respons yang sesuai (
Access-Control-Allow-Headers
untuk tajuk yang tidak sederhana,Access-Control-Allow-Methods
untuk kata kerja yang tidak sederhana) yang cocok dengan kata kerja yang tidak sederhana dan / atau tajuk yang tidak sederhana, maka browser mengirimkan permintaan yang sebenarnya.Mengandaikan bahwa Situs A ingin mengirim permintaan PUT untuk
/somePage
, dengan non-sederhanaContent-Type
nilaiapplication/json
, browser pertama akan mengirim permintaan preflight:Perhatikan itu
Access-Control-Request-Method
danAccess-Control-Request-Headers
ditambahkan oleh browser secara otomatis; Anda tidak perlu menambahkannya. Preferensi OPSI ini mendapatkan tajuk respons yang berhasil:Saat mengirim permintaan aktual (setelah preflight dilakukan), perilaku itu identik dengan bagaimana permintaan sederhana ditangani. Dengan kata lain, permintaan non-sederhana yang preflight-nya berhasil diperlakukan sama dengan permintaan sederhana (yaitu, server masih harus mengirim
Access-Control-Allow-Origin
lagi untuk tanggapan yang sebenarnya).Browser mengirim permintaan aktual:
Dan server mengirim kembali sebuah
Access-Control-Allow-Origin
, seperti halnya permintaan sederhana:Lihat Memahami XMLHttpRequest atas CORS untuk informasi lebih lanjut tentang permintaan yang tidak sederhana.
sumber
Access-Control-Allow-Origin
header, tetapi mungkin tidak memberikan respons terhadap kode JS di situs A jika header tidak mengizinkan situs A untuk memilikinya. (PS Terima kasih :))Access-Control-Allow-Origin
tidak menerima*
di beberapa browser (FF dan Chrome AFAIK). Jadi dalam hal ini Anda harus menentukan nilai dariOrigin
header. Semoga ini bisa membantu seseorang.Cross-Origin Resource Sharing -
CORS
(permintaan AJAX Cross-Domain AKA) adalah masalah yang sebagian besar pengembang web mungkin temui, menurut Same-Origin-Policy, browser membatasi JavaScript klien dalam kotak pasir keamanan, biasanya JS tidak dapat berkomunikasi secara langsung dengan server jarak jauh dari domain yang berbeda. Di masa lalu pengembang menciptakan banyak cara rumit untuk mencapai permintaan sumber daya Lintas-Domain, cara yang paling umum digunakan adalah:Cara-cara rumit tersebut memiliki lebih atau kurang beberapa masalah, misalnya JSONP dapat mengakibatkan lubang keamanan jika pengembang hanya "mengevaluasi" itu, dan # 3 di atas, meskipun berfungsi, kedua domain harus membangun kontrak yang ketat antara satu sama lain, tidak fleksibel atau elegan MENURUT OPINI SAYA:)
W3C telah memperkenalkan Cross-Origin Resource Sharing (CORS) sebagai solusi standar untuk memberikan cara standar yang aman, fleksibel dan direkomendasikan untuk menyelesaikan masalah ini.
Mekanisme
Dari level tinggi, kita dapat menganggap CORS adalah kontrak antara panggilan AJAX klien dari domain A dan halaman yang dihosting di domain B, permintaan / respons Cross-Origin tipikal adalah:
Header permintaan DomainA AJAX
Header respons DomainB
Bagian biru yang saya tandai di atas adalah fakta kernal, "Asal" header permintaan "menunjukkan di mana permintaan lintas-asal atau permintaan preflight berasal dari", header respons "Akses-Kontrol-Bolehkan-Asal" menunjukkan bahwa laman ini memungkinkan permintaan jarak jauh dari DomainA (jika nilainya * mengindikasikan memungkinkan permintaan jarak jauh dari domain apa pun).
Seperti yang saya sebutkan di atas, W3 merekomendasikan browser untuk mengimplementasikan " permintaan preflight " sebelum mengirimkan permintaan HTTP Cross-Origin yang sebenarnya, singkatnya itu adalah
OPTIONS
permintaan HTTP :Jika foo.aspx mendukung OPTIONS HTTP verb, itu mungkin mengembalikan respons seperti di bawah ini:
Hanya jika responsnya berisi "Akses-Kontrol-Bolehkan-Asal" DAN nilainya adalah "*" atau berisi domain yang mengirimkan permintaan CORS, dengan memenuhi syarat ini, browser akan mengirimkan permintaan Cross-Domain yang sebenarnya, dan menyimpan hasilnya. di " Preflight-Result-Cache ".
Saya membuat blog tentang CORS tiga tahun lalu: permintaan HTTP Cross-Origin AJAX
sumber
Pertanyaan agak terlalu tua untuk dijawab, tetapi saya memposting ini untuk referensi di masa depan untuk pertanyaan ini.
Menurut ini Mozilla Developer artikel Jaringan,
Sebuah halaman HTML dilayani dari
http://domain-a.com
membuat<img>
permintaan src untukhttp://domain-b.com/image.jpg
.Banyak halaman di web saat ini memuat sumber daya seperti stylesheet CSS , gambar , dan skrip dari domain terpisah (sehingga harus keren).
Kebijakan Asal-Sama
Untuk alasan keamanan, browser membatasi permintaan HTTP lintas-asal yang dimulai dari dalam skrip .
Misalnya,
XMLHttpRequest
danFetch
ikuti kebijakan asal-sama .Jadi, aplikasi web menggunakan
XMLHttpRequest
atauFetch
hanya bisa membuat permintaan HTTP ke domainnya sendiri .Cross-Origin Resource Sharing (CORS)
Untuk meningkatkan aplikasi web, pengembang meminta vendor peramban untuk mengizinkan permintaan lintas domain.
The Cross-Origin Resource Sharing (CORS) mekanisme memberi server web kontrol akses lintas-domain , yang memungkinkan aman transfer data cross-domain.
Browser modern menggunakan CORS dalam wadah API - seperti
XMLHttpRequest
atauFetch
- untuk mengurangi risiko permintaan HTTP lintas-asal.Cara kerja CORS (
Access-Control-Allow-Origin
tajuk)Wikipedia :
Contoh
Browser mengirim
OPTIONS
permintaan denganOrigin HTTP
tajuk.Nilai header ini adalah domain yang melayani halaman induk. Saat halaman dari
http://www.example.com
upaya mengakses data penggunaservice.example.com
, tajuk permintaan berikut akan dikirim keservice.example.com
:Asal: http://www.example.com
Server di
service.example.com
dapat merespons dengan:Sebuah
Access-Control-Allow-Origin
(Ação) header respon yang menunjukkan asal situs diperbolehkan.Sebagai contoh:
Access-Control-Allow-Origin: http://www.example.com
Halaman kesalahan jika server tidak mengizinkan permintaan lintas asal
Sebuah
Access-Control-Allow-Origin
(Ação) sundulan dengan wildcard yang memungkinkan semua domain:Access-Control-Allow-Origin: *
sumber
Access-Control-Allow-Origin:null
Access-Control-Allow-Origin
? Maksud saya negasi dariAccess-Control-Allow-Origin: *
Setiap kali saya mulai berpikir tentang CORS, intuisi saya tentang situs mana yang menjadi header tidak benar, seperti yang Anda jelaskan dalam pertanyaan Anda. Bagi saya, ada baiknya memikirkan tentang tujuan kebijakan asal yang sama.
Tujuan dari kebijakan asal yang sama adalah untuk melindungi Anda dari JavaScript jahat di siteA.com mengakses informasi pribadi yang Anda pilih untuk dibagikan hanya dengan siteB.com. Tanpa kebijakan asal yang sama, JavaScript yang ditulis oleh penulis siteA.com dapat membuat browser Anda membuat permintaan ke siteB.com, menggunakan cookie autentikasi Anda untuk siteB.com. Dengan cara ini, siteA.com dapat mencuri informasi rahasia yang Anda bagikan dengan siteB.com.
Terkadang Anda perlu bekerja lintas domain, yang merupakan tempat CORS masuk. CORS melonggarkan kebijakan asal yang sama untuk domainB.com, menggunakan
Access-Control-Allow-Origin
header untuk mendaftar domain lain (domainA.com) yang dipercaya menjalankan JavaScript yang dapat berinteraksi dengan domainA. com.Untuk memahami domain mana yang harus melayani tajuk CORS, pertimbangkan ini. Anda mengunjungi malicious.com, yang berisi beberapa JavaScript yang mencoba membuat permintaan lintas domain ke mybank.com. Seharusnya terserah mybank.com, bukan malicious.com, untuk memutuskan apakah itu menetapkan header CORS yang mengendurkan kebijakan asal yang sama yang memungkinkan JavaScript dari malicious.com berinteraksi dengannya. Jika malicous.com dapat menetapkan tajuk CORS sendiri yang memungkinkan akses JavaScriptnya sendiri ke mybank.com, ini akan sepenuhnya membatalkan kebijakan asal yang sama.
Saya pikir alasan intuisi buruk saya adalah sudut pandang yang saya miliki ketika mengembangkan sebuah situs. Ini adalah situs saya , dengan semua JavaScript saya , oleh karena itu tidak melakukan apa pun yang berbahaya dan harus terserah saya untuk menentukan situs lain mana yang dapat berinteraksi dengan JavaScript saya . Padahal sebenarnya saya harus berpikir yang lain situs JavaScript mencoba untuk berinteraksi dengan situs saya dan harus saya gunakan CORS untuk memungkinkan mereka?
sumber
1. Seorang klien mengunduh kode javascript MyCode.js dari http: // siteA - asal.
Kode yang melakukan pengunduhan - tag skrip html Anda atau xhr dari javascript atau apa pun - berasal dari, katakanlah, http: // siteZ . Dan, ketika browser meminta MyCode.js, ia mengirim header Origin: yang bertuliskan "Origin: http: // siteZ ", karena itu dapat melihat bahwa Anda meminta ke siteA dan siteZ! = SiteA. (Anda tidak dapat menghentikan atau mengganggu ini.)
2. Header respons MyCode.js berisi Access-Control-Allow-Origin: http: // siteB , yang menurut saya berarti MyCode.js diizinkan membuat referensi lintas-asal ke situs B.
tidak. Artinya, Hanya siteB yang diizinkan melakukan permintaan ini. Jadi permintaan Anda untuk MyCode.js dari siteZ malah mendapatkan kesalahan, dan browser biasanya tidak memberi Anda apa-apa. Tetapi jika Anda membuat server Anda mengembalikan ACAO: siteZ, Anda akan mendapatkan MyCode.js. Atau jika ia mengirim '*', itu akan berhasil, itu akan membiarkan semua orang masuk. Atau jika server selalu mengirim string dari Origin: header ... tapi ... untuk keamanan, jika Anda takut akan peretas , server Anda seharusnya hanya mengizinkan asal pada daftar pendek, yang diizinkan untuk membuat permintaan tersebut.
Kemudian, MyCode.js berasal dari siteA. Ketika membuat permintaan ke situs B, semuanya berasal dari silang, browser mengirim Asal: situsA, dan situsB harus mengambil situsA, mengenalinya di daftar pendek pemohon yang diizinkan, dan mengirim kembali ACAO: situsA. Hanya dengan demikian browser akan membiarkan skrip Anda mendapatkan hasil dari permintaan tersebut.
sumber
Menggunakan Bereaksi dan Aksioma , bergabunglah dengan tautan proxy ke URL dan tambahkan header seperti yang ditunjukkan di bawah ini
https://cors-anywhere.herokuapp.com/
+Your API URL
Hanya dengan menambahkan tautan Proksi akan berfungsi, tetapi juga dapat membuang kesalahan untuk Tidak Akses lagi. Oleh karena itu lebih baik menambahkan header seperti yang ditunjukkan di bawah ini.
PERINGATAN: Tidak untuk digunakan dalam Produksi
sumber
Jika Anda hanya ingin menguji aplikasi lintas domain di mana browser memblokir permintaan Anda, maka Anda bisa membuka browser Anda dalam mode tidak aman dan menguji aplikasi Anda tanpa mengubah kode Anda dan tanpa membuat kode Anda tidak aman. Dari MAC OS Anda dapat melakukan ini dari terminal:
sumber
Jika Anda menggunakan PHP, coba tambahkan kode berikut di awal file php:
Jika Anda menggunakan localhost, coba ini:
Jika Anda menggunakan domain eksternal seperti server, coba ini:
sumber
saya bekerja dengan express 4 dan node 7.4 dan angular, saya punya masalah yang sama saya bantu ini:
a) sisi server: di file app.js saya memberikan header untuk semua respons seperti:
ini harus ada sebelum semua router .
Saya melihat banyak menambahkan header ini:
tetapi saya tidak memerlukan itu,
b) sisi klien: dalam mengirim ajax Anda perlu menambahkan: "withCredentials: true," seperti:
semoga berhasil.
sumber
res.header('Access-Control-Allow-Origin', req.headers.origin);
sama denganres.header('Access-Control-Allow-Origin', '*');
Untuk berbagi asal silang, tetapkan tajuk:
'Access-Control-Allow-Origin':'*';
Php:
header('Access-Control-Allow-Origin':'*');
Node:
app.use('Access-Control-Allow-Origin':'*');
Ini akan memungkinkan untuk berbagi konten untuk domain yang berbeda.
sumber
Dalam Python saya telah menggunakan
Flask-CORS
perpustakaan dengan sukses besar. Itu membuat berurusan dengan CORS sangat mudah dan tidak menyakitkan. Saya menambahkan beberapa kode dari dokumentasi perpustakaan di bawah ini.Menginstal:
Contoh sederhana yang memungkinkan CORS untuk semua domain di semua rute:
Untuk contoh yang lebih spesifik lihat dokumentasi. Saya telah menggunakan contoh sederhana di atas untuk mengatasi masalah CORS dalam aplikasi ion yang saya bangun yang harus mengakses server labu terpisah.
sumber
Dari pengalaman saya sendiri, sulit untuk menemukan penjelasan sederhana mengapa CORS bahkan menjadi perhatian.
Setelah Anda mengerti mengapa itu ada di sana, tajuk dan diskusi menjadi jauh lebih jelas. Saya akan mencobanya dalam beberapa baris.
Ini semua tentang cookie. Cookie disimpan di klien dengan domain mereka.
Poin kunci: Ketika klien membuat permintaan ke server, itu akan mengirim cookie yang disimpan di bawah domain tempat klien aktif.
Jika klien lain membuat permintaan asal silang ke server, cookie tersebut dikirimkan bersama, seperti sebelumnya. Ruh roh.
Karena cookie divalidasi seperti yang diharapkan, server akan mengesahkan respons.
Astaga.
Jadi sekarang, beberapa pertanyaan dan jawaban menjadi jelas:
sumber
Cukup tempel kode berikut di file web.config Anda.
Tercatat, Anda harus menempelkan kode berikut di bawah
<system.webServer>
tagsumber
Untuk info lebih lanjut, kunjungi di sini ....
sumber
Nginx dan Appache
Sebagai tambahan untuk jawaban apsillers, saya ingin menambahkan grafik wiki yang menunjukkan kapan permintaan sederhana atau tidak (dan permintaan pra-penerbangan OPSI dikirim atau tidak)
Untuk permintaan sederhana (mis. Gambar hotlinking ) Anda tidak perlu mengubah file konfigurasi server Anda tetapi Anda dapat menambahkan header dalam aplikasi (di-host di server, misalnya dalam php) seperti Melvin Guerrero menyebutkan dalam jawabannya - tetapi ingat : jika Anda menambahkan penuh header kor di server Anda (config) dan pada saat yang sama Anda mengizinkan kor sederhana pada aplikasi (mis. php) ini tidak akan berfungsi sama sekali.
Dan berikut adalah konfigurasi untuk dua server populer
nyalakan CORS di Nginx (
nginx.conf
file)Tampilkan cuplikan kode
nyalakan CORS pada Appache (
.htaccess
file)Tampilkan cuplikan kode
sumber