Cara saya memahaminya, jika skrip sisi klien yang berjalan pada halaman dari foo.com ingin meminta data dari bar.com, dalam permintaan itu harus menentukan header Origin: http://foo.com
, dan bar harus merespons dengan Access-Control-Allow-Origin: http://foo.com
.
Apa yang ada untuk menghentikan kode berbahaya dari situs roh.com dari hanya memalsukan header Origin: http://foo.com
untuk meminta halaman dari bar?
javascript
ajax
http
cors
Jay Lamont
sumber
sumber
foo.com
) harus memberikanAccess-Control-Allow-Origin
tajuk atau browser tidak mengizinkan permintaan untukbar.com
.Jawaban:
Browser mengendalikan pengaturan
Origin
tajuk, dan pengguna tidak dapat mengesampingkan nilai ini. Jadi Anda tidak akan melihatOrigin
tajuk yang dipalsukan dari peramban. Pengguna jahat dapat membuat permintaan ikal yang mengaturOrigin
tajuk secara manual , tetapi permintaan ini akan datang dari luar peramban, dan mungkin tidak memiliki info khusus peramban (seperti cookie).Ingat: CORS bukan keamanan. Jangan mengandalkan CORS untuk mengamankan situs Anda. Jika Anda menyajikan data yang dilindungi, gunakan cookie atau token OAuth atau sesuatu selain
Origin
header untuk mengamankan data itu. TheAccess-Control-Allow-Origin
header CORS hanya perintah yang asal harus diizinkan untuk membuat permintaan cross-asal. Jangan mengandalkan itu untuk hal lain.sumber
TLDR: Tidak ada yang menghentikan kode jahat dari spoofing asalnya. Ketika itu terjadi, server Anda tidak akan pernah mengetahuinya dan akan bertindak atas permintaan tersebut. Terkadang permintaan itu mahal. Jadi jangan gunakan CORS sebagai ganti segala jenis keamanan.
Saya telah bermain-main dengan CORS baru-baru ini, dan saya bertanya pada diri sendiri pertanyaan yang sama. Apa yang saya temukan adalah bahwa browser mungkin cukup pintar untuk mengetahui permintaan CORS palsu ketika melihatnya, tetapi server Anda tidak sepintar itu.
Hal pertama yang saya temukan adalah bahwa
Origin
header adalah nama header HTTP terlarang yang tidak dapat dimodifikasi secara pemrograman. Yang berarti Anda dapat memodifikasinya dalam waktu sekitar 8 detik menggunakan Modify Headers untuk Google Chrome .Untuk mengujinya, saya menyiapkan dua domain Klien dan satu domain Server. Saya menyertakan daftar putih CORS di Server, yang memungkinkan permintaan CORS dari Klien 1 tetapi tidak dari Klien 2. Saya menguji kedua klien, dan memang permintaan CORS 1 Klien berhasil sementara Klien 2 gagal.
Lalu saya spoof
Origin
header Klien 2 untuk mencocokkan Klien 1. Server menerimaOrigin
tajuk palsu , dan berhasil melewati pemeriksaan daftar putih (atau gagal jika Anda tipe pria setengah gelas kosong). Setelah itu, Server melakukan dengan patuh dengan mengonsumsi semua sumber daya yang dirancang untuk dikonsumsi (panggilan basis data, mengirim email mahal, mengirim pesan sms bahkan lebih mahal, dll.). Ketika itu selesai, server dengan senang hati mengirimAccess-Control-Allow-Origin
header palsu itu kembali ke browser.Dokumentasi yang saya baca menyatakan bahwa
Access-Control-Allow-Origin
nilai yang diterima harus sama denganOrigin
nilai yang dikirim dalam permintaan. Mereka memang cocok, jadi saya terkejut ketika saya melihat pesan berikut di Chrome:Dokumentasi yang saya baca sepertinya tidak akurat. Tab jaringan Chrome dengan jelas menunjukkan header permintaan dan respons sebagai
http://client1.dev
, tetapi Anda dapat melihat dalam kesalahan bahwa entah bagaimana Chrome mengetahui asal sebenarnyahttp://client2.dev
dan menolak tanggapan dengan benar. Yang tidak penting pada saat ini karena server sudah menerima permintaan palsu dan menghabiskan uang saya.sumber
There's nothing stopping malicious code from spoofing the origin
-> Ya ada, javascript tidak dapat diaturOrigin
. Ya, pengguna dapat memodifikasi browser mereka / menggunakan fiddler untuk mengubah asal, tapi bukan itu yang CORS pertahankan; situs web yang dikendalikan penyerang tidak dapat mengubah Asal, yang penting.Hanya bungkus sederhana:
T: Apakah Kebijakan Asal yang Sama (SOP) diberlakukan hanya oleh browser?
A: Ya. Untuk semua panggilan yang Anda lakukan di dalam browser, SOP sudah pasti diterapkan oleh browser. Server mungkin atau mungkin tidak memeriksa asal permintaan.
T: Jika permintaan tidak mematuhi SOP, apakah browser memblokirnya?
A: Tidak, itu di luar otoritas browser. Peramban hanya mengirim permintaan asal silang dan menunggu respons untuk melihat apakah panggilan tersebut ditandai oleh server melalui
Access-Control
header - *. Jika server tidak mengirim kembaliAccess-Control-Allow-Origin
header, tidak mengulangi asal pemanggil, atau tidak mengirim kembali*
di header, maka semua hal yang browser akan lakukan adalah menahan diri untuk tidak memberikan respons kepada pemanggil.T: Apakah itu berarti saya tidak bisa menipu
Origin
?A: Di browser dan menggunakan skrip, Anda tidak dapat menimpa
Origin
karena berada dalam kendali browser. Namun, jika Anda ingin meretas sendiri, Anda dapat merusak panggilan yang keluar dari browser ANDA menggunakan ekstensi browser atau alat lain yang Anda instal pada mesin Anda. Anda juga dapat mengeluarkanHTTP
panggilan menggunakancurl
,Python
,C#
, dll dan mengubahOrigin
header server trik.T: Jadi jika saya bisa mengelabui server dengan mengubah
Origin
, apakah itu berartiCORS
tidak aman?A:
CORS
per se diam tentang keamanan - yaitu otentikasi dan otorisasi permintaan. Terserah server untuk memeriksa permintaan dan mengotentikasi / mengotorisasi mereka dengan mekanisme apa pun yang bekerja dengan mereka seperti cookie dan header. Karena itu, itu dapat melindungi kita sedikit lebih dalam kasus serangan seperti XSS:Contoh: Katakanlah Anda telah masuk ke situs web Anda dan skrip jahat mencoba mengirim permintaan ke situs web bank Anda untuk menanyakan saldo Anda: serangan Refleksi XSS . Situs web bank Anda memercayai kredensial yang berasal dari (di sini atas nama) situs web Anda sehingga permintaan akan diautentikasi dan
HTTP
respons yang bertujuan untuk kode berbahaya dikeluarkan. Jika situs web bank Anda tidak peduli tentang berbagi titik akhir dengan sumber lain, itu tidak termasukAccess-Control-Allow-Origin
sundulan dalam respons. Sekarang, setelah kedatangan permintaan, browser menyadari bahwa permintaan tersebut adalah permintaan Cross Origins, tetapi responsnya tidak menunjukkan bahwa server senang berbagi sumber daya (di sini titik akhir kueri saldo) dengan situs web Anda. Jadi itu memutus aliran, maka hasil yang dikembalikan tidak akan pernah mencapai kode berbahaya.sumber