Di seluruh internet, saya melihat saran berikut:
GET jangan pernah mengubah data di server - gunakan permintaan POST untuk itu
Apa dasar dari ide ini?
Jika saya membuat layanan php yang memasukkan data dalam database, dan mengirimkannya parameter dalam string kueri GET, mengapa itu salah? (Saya menggunakan pernyataan yang disiapkan, untuk mengurus SQL Injection). Apakah permintaan POST dalam beberapa cara lebih aman?
Atau adakah alasan bersejarah untuk ini? Jika demikian, seberapa validkah nasihat ini hari ini?
http
http-request
Devdatta Tengshe
sumber
sumber
Jawaban:
Ini bukan nasihat.
A
GET
didefinisikan dengan cara ini dalam protokol HTTP . Seharusnya idempoten dan aman .Adapun alasannya - a
GET
bisa di-cache dan di browser, di-refresh. Lagi dan lagi dan lagi.Ini berarti bahwa jika Anda membuat yang sama
GET
lagi, Anda akan memasukkan ke dalam basis data Anda lagi .Pertimbangkan apa artinya ini jika tautan
GET
menjadi dan dirayapi oleh mesin pencari. Database Anda akan penuh dengan data duplikat.Saya juga menyarankan membaca URI, Addressability, dan penggunaan HTTP GET dan POST .
Ada juga masalah dengan pranala tautan di beberapa peramban - mereka akan melakukan panggilan untuk mengambil pranata tautan, bahkan jika tidak ditunjukkan demikian oleh penulis halaman.
Jika, katakanlah, logout Anda berada di belakang "GET", ditautkan dari setiap halaman di situs Anda, orang-orang dapat logout hanya karena perilaku ini.
sumber
GET
tidak akan pernah menjadi tindakan destruktif (memang demikian, karena sudah ditentukan dengan cara ini). Jika sekarang Anda menghancurkan aplikasi Anda dengan melanggar spesifikasi itu, Anda akan bisa mempertahankan kedua bagian dari aplikasi Anda.GET
. Nasihat itu benar-benar salah. Aman berarti bahwa pengguna tidak dapat dimintai pertanggungjawaban atas efek samping, bukan karena tidak ada efek samping. Kalau tidak, Anda tidak dapat memiliki file log untuk server Anda, yang tidak masuk akal! Ini dijabarkan dengan sangat jelas di bagian 9.1.1 dari RFC2616.GET
seharusnya tidak mengubah sumber daya yang diminta olehGET
, tetapi itu tidak berarti 'tidak ada di server yang harus berubah'. Tentu saja hal-hal seperti log, penghitung, dan status server lainnya dapat berubah selama permintaan apa pun.Setiap kata kerja HTTP memiliki tanggung jawabnya sendiri. Misalnya
GET
, seperti yang didefinisikan oleh RFCPOST
, di sisi lain, berarti memasukkan atau lebih formalAlasan untuk mempertahankannya seperti ini:
GET
untuk bertindak sebagai sarana pengambilan informasi dan penggalian dataGET
secara efektif adalah bacaan , sedangkanPOST
secara efektif adalah menulisGET
ke URL yang sama harus mengembalikan hasil yang sama kepada semua pengguna atau Anda tidak akan memiliki kepercayaan apa pun atas hasil yang dikembalikanUntuk kelengkapan dan hanya untuk menegakkan penggunaan yang benar (sumber) :
GET
parameter dilewatkan sebagai bagian dari URL, yang panjangnya 256 karakter dan terbatas, dengan beberapa server mendukung 4000+ karakter. Jika Anda ingin menyisipkan catatan panjang, tidak ada cara yang sah untuk meneruskan data ini̶G̶E̶T̶
̶ ditransfer Plain Text. URL sebenarnya dienkripsi dengan TLS, jadi TLS baik-baik saja.GET
tidak praktisGET
dieksekusi kembali jika pengguna menekan tombol Kembali di browser?
tanda masuk di dalamnyasumber
EDIT: Sebelumnya, saya katakan POST membantu melindungi Anda dari CSRF tetapi ini salah. Saya tidak memikirkan ini dengan benar. Anda harus meminta token tersembunyi unik sesi-lingkup dalam semua permintaan Anda untuk mengubah data agar terlindung dari CSRF.
Pada hari-hari awal internet ada akselerator browser. Program-program ini akan mulai mengklik tautan pada halaman untuk menyimpan konten. Google Web Accelerator adalah salah satu dari program ini. Ini bisa mendatangkan malapetaka pada aplikasi yang membuat perubahan saat tautan diklik. Saya akan membuat asumsi bahwa masih ada orang yang menggunakan perangkat lunak akselerator.
Server dan browser proksi akan men-cache permintaan GET sehingga ketika pengguna mengakses kembali halaman itu mungkin tidak mengirimkan permintaan ke aplikasi Anda sehingga pengguna berpikir mereka mengambil tindakan, tetapi sebenarnya tidak.
sumber
Jawaban paling sederhana adalah "karena bukan itu
GET
artinya."Menggunakan
GET
untuk meneruskan data untuk pembaruan seperti menulis surat cinta dan mengirimkannya dalam amplop bertanda "PENAWARAN KHUSUS - BERTINDAK SEKARANG!" Dalam kedua kasus, Anda seharusnya tidak terkejut penerima dan / atau perantara salah menangani pesan Anda .sumber
Untuk operasi CRUD Anda dalam aplikasi berbasis database gunakan skema berikut:
Gunakan HTTP DAPATKAN untuk Operasi Baca (SQL SELECT)
Gunakan HTTP PUT untuk Operasi Pembaruan (SQL UPDATE)
Gunakan HTTP POST untuk Membuat Operasi (SQL INSERT)
Gunakan HTTP DELETE untuk Menghapus Operasi (SQL DELETE)
sumber
Nasihat itu, dan semua jawaban di sini salah. Jelas saya terlalu dramatis, jawaban lainnya sangat bagus, tetapi saya percaya saran yang tepat harus diberikan sebagai:
Mengatakan "tidak pernah" terlalu ekstrim, dan meskipun jawaban lain di sini secara akurat menjelaskan mengapa Anda "jarang" melakukannya, ada beberapa skenario di mana sangat masuk akal untuk mengubah data dengan GET. Contohnya adalah tautan verifikasi email sekali pakai. Biasanya tautan ini berisi GUID yang ketika diakses harus mengubah data. Jika diterapkan dengan benar, permintaan GET identik berikutnya akan diabaikan.
Ini jelas merupakan kasus tepi, tetapi tentu patut dicatat.
sumber