Permintaan GET sedikit kurang aman dibandingkan permintaan POST. Tidak ada yang menawarkan "keamanan" sejati dengan sendirinya; menggunakan permintaan POST tidak akan secara ajaib membuat situs web Anda aman terhadap serangan jahat dengan jumlah yang nyata. Namun, menggunakan permintaan GET dapat membuat aplikasi yang tidak aman menjadi tidak aman.
Mantra yang Anda "tidak boleh menggunakan permintaan GET untuk melakukan perubahan" masih sangat valid, tetapi ini tidak ada hubungannya dengan perilaku jahat . Formulir login adalah yang paling sensitif untuk dikirim menggunakan jenis permintaan yang salah.
Cari spider dan akselerator web
Inilah alasan sebenarnya Anda harus menggunakan permintaan POST untuk mengubah data. Laba-laba pencarian akan mengikuti setiap tautan di situs web Anda, tetapi tidak akan mengirimkan formulir acak yang mereka temukan.
Akselerator web lebih buruk daripada laba-laba pencarian, karena dijalankan pada mesin klien, dan "klik" semua tautan dalam konteks pengguna yang masuk . Dengan demikian, aplikasi yang menggunakan permintaan GET untuk menghapus hal-hal, bahkan jika itu memerlukan administrator, dengan senang hati akan mematuhi perintah akselerator web (tidak berbahaya!) Dan menghapus semua yang dilihatnya .
Deputi serangan bingung
Sebuah wakil serangan bingung (di mana wakil adalah browser) adalah mungkin terlepas dari apakah Anda menggunakan GET atau permintaan POST .
Di situs web yang dikontrol oleh penyerang, GET dan POST sama mudah dikirim tanpa interaksi pengguna .
Satu-satunya skenario di mana POST sedikit kurang rentan adalah bahwa banyak situs web yang tidak di bawah kendali penyerang (katakanlah, forum pihak ketiga) memungkinkan penyisipan gambar sewenang-wenang (memungkinkan penyerang untuk menyuntikkan permintaan GET sewenang-wenang), tetapi mencegah semua cara menyuntikkan permintaan POST arbiter, baik otomatis atau manual.
Orang mungkin berpendapat bahwa akselerator web adalah contoh serangan wakil bingung, tapi itu hanya masalah definisi. Jika ada, penyerang berbahaya tidak memiliki kontrol atas ini, sehingga hampir tidak serangan , bahkan jika wakil yang bingung.
Log proxy
Server proxy cenderung mencatat URL GET secara keseluruhan, tanpa menghapus string kueri. Parameter permintaan POST biasanya tidak dicatat. Cookie tidak mungkin masuk dalam kedua kasus ini. (contoh)
Ini adalah argumen yang sangat lemah dalam mendukung POST. Pertama, lalu lintas yang tidak dienkripsi dapat dicatat secara keseluruhan; proxy jahat sudah memiliki semua yang dibutuhkannya. Kedua, parameter permintaan terbatas digunakan untuk penyerang: apa yang sebenarnya mereka butuhkan adalah cookie, jadi jika satu-satunya yang mereka miliki adalah log proxy, mereka tidak mungkin dapat menyerang URL GET atau POST.
Ada satu pengecualian untuk permintaan login: ini cenderung mengandung kata sandi pengguna. Menyimpan ini di log proksi membuka vektor serangan yang tidak ada dalam kasus POST. Namun, login melalui HTTP biasa secara inheren tidak aman.
Cache proksi
Caching proxy mungkin menyimpan respons GET, tetapi bukan respons POST. Karena itu, respons GET dapat dibuat non-cacheable dengan sedikit usaha daripada mengonversi URL ke POST handler.
HTTP "Referer"
Jika pengguna menavigasi ke situs web pihak ketiga dari halaman yang disajikan sebagai tanggapan terhadap permintaan GET, situs web pihak ketiga tersebut dapat melihat semua parameter permintaan GET.
Milik kategori "mengungkapkan parameter permintaan ke pihak ketiga", yang tingkat keparahannya tergantung pada apa yang ada pada parameter tersebut. Permintaan POST secara alami kebal terhadap ini, namun untuk mengeksploitasi permintaan GET, peretas perlu memasukkan tautan ke situs web mereka sendiri ke dalam respons server.
Riwayat peramban
Ini sangat mirip dengan argumen "log proksi": Permintaan GET disimpan dalam riwayat peramban beserta parameternya. Penyerang dapat dengan mudah memperoleh ini jika mereka memiliki akses fisik ke mesin.
Tindakan menyegarkan peramban
Peramban akan mencoba kembali permintaan GET segera setelah pengguna menekan "menyegarkan". Mungkin melakukannya ketika mengembalikan tab setelah dimatikan. Tindakan apa pun (katakanlah, pembayaran) dengan demikian akan diulang tanpa peringatan.
Browser tidak akan mencoba lagi permintaan POST tanpa peringatan.
Ini adalah alasan yang baik untuk menggunakan hanya permintaan POST untuk mengubah data, tetapi tidak ada hubungannya dengan perilaku jahat dan, karenanya, keamanan.
Jadi apa yang harus aku lakukan?
- Gunakan hanya permintaan POST untuk mengubah data, terutama karena alasan yang tidak terkait keamanan.
- Gunakan hanya permintaan POST untuk formulir login; melakukan sebaliknya memperkenalkan vektor serangan.
- Jika situs Anda melakukan operasi sensitif, Anda benar-benar membutuhkan seseorang yang tahu apa yang mereka lakukan, karena ini tidak dapat dicakup dalam satu jawaban. Anda perlu menggunakan HTTPS, HSTS, CSP, mitigasi injeksi SQL, injeksi skrip (XSS) , CSRF , dan banyak hal lain yang mungkin spesifik untuk platform Anda (seperti kerentanan penugasan massal dalam berbagai kerangka kerja: ASP.NET MVC , Ruby on Rails , dll.) Tidak ada satu hal pun yang akan membuat perbedaan antara "aman" (tidak dapat dieksploitasi) dan "tidak aman".
Lebih dari HTTPS, data POST disandikan, tetapi bisakah URL diendus oleh pihak ketiga?
Tidak, mereka tidak bisa diendus. Tetapi URL akan disimpan dalam riwayat browser.
Apakah adil untuk mengatakan praktik terbaik adalah menghindari kemungkinan menempatkan data sensitif dalam POST atau GET sama sekali dan menggunakan kode sisi server untuk menangani informasi sensitif?
Bergantung pada seberapa sensitifnya itu, atau lebih khusus lagi, dengan cara apa. Jelas klien akan melihatnya. Siapa pun yang memiliki akses fisik ke komputer klien akan melihatnya. Klien dapat menipu itu ketika mengirimkannya kembali kepada Anda. Jika itu penting maka ya, simpan data sensitif di server dan jangan biarkan itu pergi.