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 menerima Origin
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 mengirim Access-Control-Allow-Origin
header palsu itu kembali ke browser.
Dokumentasi yang saya baca menyatakan bahwa Access-Control-Allow-Origin
nilai yang diterima harus sama dengan Origin
nilai yang dikirim dalam permintaan. Mereka memang cocok, jadi saya terkejut ketika saya melihat pesan berikut di Chrome:
XMLHttpRequest tidak dapat memuat http://server.dev/test
. Header 'Access-Control-Allow-Origin' memiliki nilai http://client1.dev
yang tidak sama dengan asal yang disediakan. http://client2.dev
Karena itu, Asal tidak diizinkan mengakses.
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 sebenarnya http://client2.dev
dan menolak tanggapan dengan benar. Yang tidak penting pada saat ini karena server sudah menerima permintaan palsu dan menghabiskan uang saya.
foo.com
) harus memberikanAccess-Control-Allow-Origin
tajuk atau browser tidak mengizinkan permintaan untukbar.com
.