Apa motivasi di balik memperkenalkan permintaan preflight?
Permintaan Preflight diperkenalkan sehingga browser dapat yakin itu berurusan dengan server yang menyadari CORS sebelum mengirim permintaan tertentu. Permintaan tersebut didefinisikan sebagai permintaan yang berpotensi berbahaya (perubahan negara) dan baru (tidak mungkin dilakukan sebelum CORS karena Kebijakan Asal yang Sama ). Menggunakan permintaan preflight berarti bahwa server harus ikut serta (dengan merespons dengan baik pada preflight) untuk jenis permintaan baru yang berpotensi berbahaya yang dimungkinkan oleh CORS.
Itulah arti dari bagian spesifikasi ini : "Untuk melindungi sumber daya terhadap permintaan lintas-asal yang tidak dapat berasal dari agen pengguna tertentu sebelum spesifikasi ini ada, permintaan preflight dibuat untuk memastikan bahwa sumber daya mengetahui spesifikasi ini."
Bisakah Anda memberi saya contoh?
Mari kita bayangkan bahwa pengguna browser masuk ke situs perbankan mereka di A.com
. Ketika mereka menavigasi ke malicious B.com
, halaman itu menyertakan beberapa Javascript yang mencoba mengirim DELETE
permintaan A.com/account
. Karena pengguna masuk ke A.com
, permintaan itu, jika dikirim, akan termasuk cookie yang mengidentifikasi pengguna.
Sebelum CORS, Kebijakan Asal Sama browser akan memblokirnya dari mengirimkan permintaan ini. Tetapi karena tujuan CORS adalah untuk memungkinkan komunikasi lintas asal semacam ini menjadi mungkin, itu tidak lagi sesuai.
Peramban dapat dengan mudah mengirim DELETE
dan membiarkan server memutuskan bagaimana menanganinya. Tetapi bagaimana jika A.com
tidak mengetahui protokol CORS? Itu mungkin pergi dan mengeksekusi yang berbahaya DELETE
. Mungkin diasumsikan bahwa — karena Kebijakan Same Origin dari peramban — ia tidak akan pernah bisa menerima permintaan seperti itu, dan karenanya mungkin tidak akan pernah diperketat terhadap serangan semacam itu.
Untuk melindungi server yang tidak menyadari CORS, protokol memerlukan browser untuk terlebih dahulu mengirim permintaan preflight . Jenis permintaan baru ini adalah sesuatu yang hanya dapat ditanggapi oleh server yang sadar dengan CORS, memungkinkan peramban mengetahui apakah aman mengirim yang sebenarnya atau tidak DELETE
.
Mengapa semua ini ribut tentang browser, tidak bisa penyerang hanya mengirim DELETE
permintaan dari komputer mereka sendiri?
Tentu, tetapi permintaan seperti itu tidak akan menyertakan cookie pengguna. Serangan yang dirancang untuk mencegah hal ini bergantung pada fakta bahwa browser akan mengirim cookie (khususnya, informasi otentikasi untuk pengguna) untuk domain lain bersama dengan permintaan.
Itu terdengar seperti Cross-Site Request Pemalsuan , di mana formulir di situs B.com
dapat POST
untuk A.com
dengan cookie pengguna dan melakukan kerusakan.
Betul. Cara lain untuk menempatkan ini adalah bahwa permintaan preflight dibuat agar tidak meningkatkan permukaan serangan CSRF untuk server yang tidak menyadari CORS.
Tetapi melihat persyaratan untuk permintaan "sederhana" yang tidak memerlukan preflight, saya melihat bahwa POST
itu masih diperbolehkan. Itu dapat mengubah status dan menghapus data seperti DELETE
!
Itu benar! CORS tidak melindungi situs Anda dari serangan CSRF. Kemudian lagi, tanpa CORS Anda juga tidak terlindungi dari serangan CSRF. Tujuan permintaan preflight adalah hanya untuk membatasi paparan CSRF Anda dengan apa yang sudah ada di dunia pra-CORS.
Mendesah. OK, saya dengan enggan menerima kebutuhan untuk permintaan preflight. Tetapi mengapa kita harus melakukannya untuk setiap sumber daya (URL) di server? Server menangani CORS atau tidak.
Apa kamu yakin akan hal itu? Tidak jarang banyak server menangani permintaan untuk satu domain. Sebagai contoh, itu mungkin kasus yang meminta untuk A.com/url1
ditangani oleh satu jenis server dan permintaan untuk A.com/url2
ditangani oleh jenis server yang berbeda. Ini umumnya bukan kasus bahwa server yang menangani sumber daya tunggal dapat membuat jaminan keamanan tentang semua sumber daya di domain itu.
Baik. Mari berkompromi. Mari kita buat header CORS baru yang memungkinkan server untuk menyatakan dengan tepat sumber daya apa yang dapat berbicara, sehingga permintaan preflight tambahan untuk URL tersebut dapat dihindari.
Ide bagus! Bahkan, tajuk Access-Control-Policy-Path
itu diusulkan hanya untuk tujuan ini. Namun, pada akhirnya, itu tidak termasuk dalam spesifikasi, tampaknya karena beberapa server salah menerapkan spesifikasi URI sedemikian rupa sehingga permintaan untuk jalur yang tampaknya aman untuk browser sebenarnya tidak aman di server yang rusak.
Apakah ini keputusan bijaksana yang mengutamakan keamanan daripada kinerja, yang memungkinkan browser untuk segera mengimplementasikan spesifikasi CORS tanpa menempatkan server yang ada dalam risiko? Atau apakah itu picik untuk menghancurkan internet untuk memboroskan bandwidth dan menggandakan latensi hanya untuk mengakomodasi bug di server tertentu pada waktu tertentu?
Pendapat berbeda.
Ya, setidaknya browser akan menyimpan cache preflight untuk satu URL?
Iya. Meskipun mungkin tidak terlalu lama. Di browser WebKit, waktu cache preflight maksimum saat ini adalah 10 menit .
Mendesah. Nah, jika saya tahu bahwa server saya sadar CORS, dan karena itu tidak memerlukan perlindungan yang ditawarkan oleh permintaan preflight, apakah ada cara bagi saya untuk menghindarinya?
Satu-satunya pilihan nyata Anda adalah memastikan bahwa Anda memenuhi persyaratan untuk permintaan "sederhana". Itu mungkin berarti mengabaikan tajuk ubahsuaian yang akan Anda sertakan (seperti X-Requested-With
), berbohong tentang Content-Type
, atau lebih.
Apa pun yang Anda lakukan, Anda harus memastikan bahwa Anda memiliki perlindungan CSRF yang tepat karena spesifikasi CORS tidak membahas penolakan permintaan "sederhana", termasuk yang tidak aman POST
. Seperti yang dinyatakan dalam spesifikasinya : "sumber daya yang permintaan sederhananya memiliki arti penting selain pengambilan harus melindungi diri dari Pemalsuan Permintaan Lintas Situs".