Kapan saya harus menggunakan metode GET atau POST? Apa perbedaan di antara mereka?


249

Apa bedanya saat menggunakan GETatau POSTmetode? Mana yang lebih aman? Apa kelebihan (dis) masing-masing dari mereka?

( pertanyaan serupa )


2
Dapatkan tidak memiliki badan sehingga dalam praktiknya berarti Anda terbatas pada nama -> pasangan nilai sebagai struktur data karena tidak adanya format penyandian string kueri untuk struktur yang lebih kompleks. Jika Anda perlu menangani struktur data yang lebih kompleks dalam permintaan Anda (yaitu array, objek, dll.) Anda perlu menggunakan POST dan mungkin format yang lebih maju (json / xml). Singkat kata: jangan gunakan GET kecuali Anda benar-benar harus (yaitu URL / sumber daya harus dapat ditemukan).
themihai

Jawaban:


263

Ini bukan masalah keamanan. Protokol HTTP mendefinisikan permintaan tipe-GET sebagai idempoten , sementara POST mungkin memiliki efek samping. Dalam bahasa Inggris biasa, itu artinya GET digunakan untuk melihat sesuatu, tanpa mengubahnya, sementara POST digunakan untuk mengubah sesuatu. Misalnya, halaman pencarian harus menggunakan GET, sedangkan formulir yang mengubah kata sandi Anda harus menggunakan POST.

Juga, perhatikan bahwa PHP sedikit membingungkan konsep. Permintaan POST mendapat input dari string kueri dan melalui badan permintaan. Permintaan GET baru saja mendapat input dari string kueri. Jadi permintaan POST adalah superset dari permintaan GET; Anda dapat menggunakan $_GETdalam permintaan POST, dan bahkan mungkin masuk akal untuk memiliki parameter dengan nama yang sama $_POSTdan $_GETitu berarti hal yang berbeda.

Misalnya, katakanlah Anda memiliki formulir untuk mengedit artikel. Artikel-id mungkin ada di string kueri (dan, jadi, tersedia melalui $_GET['id']), tetapi katakanlah Anda ingin mengubah artikel-id. Id baru kemudian dapat hadir di badan permintaan ( $_POST['id']). Oke, mungkin itu bukan contoh terbaik, tapi saya harap ini menggambarkan perbedaan antara keduanya.


13
Jelas ada aspek keamanan untuk perbedaan antara GET dan POST. Situs jahat dapat menempel permintaan GET sewenang-wenang dalam tag gambar misalnya, menyebabkan pengguna melakukan GET terhadap server lain. Jika GET ini seperti akun orang lain / penghapusan, maka hal-hal buruk terjadi.
Frank Schwieterman

2
Yang saya maksudkan adalah bahwa isi $ _POST tidak secara ajaib disembunyikan dari pengguna jahat. Jelas ada aspek keamanan untuk semua pemrograman hal.
troelskn

1
Posting ini tidak menjawab pertanyaan sepenuhnya karena dia tidak menyebutkan implikasi keamanan. Bagian atas baik selama kesalahan ejaan "pain English" diubah menjadi "plain English". Bagian bawah terlalu sulit untuk diikuti. Secara keseluruhan, jauh lebih baik daripada posting saya tho. :-)
Akrikos

1
"Permintaan POST mendapat input dari string kueri dan melalui badan permintaan." IMHO ini tidak benar. Untuk menggunakan input mana pun Anda perlu menggunakan $ _REQUEST. $ _POST tidak mendapatkan entri url.
Gunnar Bernstein

1
@ Frank Schwieterman Saya tahu posting ini sudah tua, tetapi hapus akun saya tidak idempoten dan tidak boleh menggunakan get.
frostymarvelous

77

Ketika pengguna memasukkan informasi dalam formulir dan klik Kirim, ada dua cara informasi dapat dikirim dari browser ke server: di URL, atau di dalam tubuh permintaan HTTP.

Metode GET, yang digunakan dalam contoh sebelumnya, menambahkan pasangan nama / nilai ke URL. Sayangnya, panjang URL terbatas, jadi metode ini hanya berfungsi jika hanya ada beberapa parameter. URL dapat dipotong jika formulir menggunakan sejumlah besar parameter, atau jika parameter tersebut berisi sejumlah besar data. Selain itu, parameter yang diteruskan pada URL terlihat di bidang alamat browser bukan tempat terbaik untuk kata sandi ditampilkan.

Alternatif untuk metode GET adalah metode POST. Metode ini mengemas pasangan nama / nilai di dalam isi permintaan HTTP, yang menjadikan URL lebih bersih dan tidak memberikan batasan ukuran pada output formulir. Itu juga lebih aman.


1
Bagaimana ini lebih "aman"?
Julian Reschke

4
karena lebih sulit untuk berubah? Anda dapat mengubah GET di bilah alamat, tetapi tidak semudah itu dengan POST.
IAdapter

8
Server tidak bisa mempercayai klien. Mendesain aplikasi Anda berdasarkan asumsi yang salah, jauh dari aman.
troelskn

openid juga tidak menyimpan, karena bisa rusak?
IAdapter

1
Saya percaya ini adalah penjelasan yang paling jelas - perbedaan tentang penempatan data yang dikirim. Terima kasih.
greenoldman

37

Jawaban terbaik adalah yang pertama.

Anda menggunakan:

  • DAPATKAN ketika Anda ingin mengambil data (DAPATKAN DATA).
  • POST saat Anda ingin mengirim data (POST DATA).

2
Apa pola layanan permintaan / respons yang digunakan dan Anda ingin melakukan keduanya? ;) Saya lebih suka menggunakan POST dalam sebagian besar kasus ketika saya perlu mendapat balasan.
Dmitry Pavlov

8
Secara umum itu benar. GETsangat mampu 'mengirim' data juga, jadi bukan jawaban yang sangat akurat.
Patrick Hofman

23

Ada dua implikasi "keamanan" yang umum digunakan GET. Karena data muncul di string URL, seseorang yang mungkin melihat dari balik bahu Anda di Bilah Alamat / URL mungkin dapat melihat sesuatu yang tidak boleh mereka ketahui seperti cookie sesi yang berpotensi digunakan untuk membajak sesi Anda. Perlu diingat bahwa setiap orang memiliki ponsel kamera.

Implikasi keamanan lain GETberkaitan dengan GETvariabel yang sedang dicatat ke sebagian besar akses web server log sebagai bagian dari URL yang meminta. Tergantung pada situasi, iklim peraturan dan sensitivitas umum data ini berpotensi menimbulkan kekhawatiran.

Beberapa klien / firewall / sistem IDS mungkin mengernyit atas GETpermintaan yang berisi jumlah data berlebihan dan karenanya dapat memberikan hasil yang tidak dapat diandalkan.

POST mendukung fungsionalitas tingkat lanjut seperti dukungan untuk input biner multi-bagian yang digunakan untuk mengunggah file ke server web.

POSTmembutuhkan tajuk panjang konten yang dapat meningkatkan kompleksitas penerapan klien spesifik aplikasi karena ukuran data yang dikirim harus diketahui terlebih dahulu mencegah permintaan klien terbentuk dalam mode inkremental single-pass eksklusif. Mungkin masalah kecil bagi mereka yang memilih untuk menyalahgunakan HTTPdengan menggunakannya sebagai transportasi RPC (Remote Procedure Call).

Yang lain telah melakukan pekerjaan dengan baik dalam meliput perbedaan semantik dan bagian "kapan" dari pertanyaan ini.


17

Saya menggunakan GET ketika saya mengambil informasi dari URL dan POST ketika saya mengirim informasi ke URL.


1
tetapi Anda dapat menggunakan GET untuk mengirim juga. Perbedaannya adalah format (dalam url (GET) atau dalam permintaan (POST)).
eric

Jika titik akhir menerima file dan mengembalikan garis dari file (tidak ada pembuatan atau perubahan data atau database yang terlibat), maka apakah titik akhir harus DAPATKAN atau POST?
variabel

17

Anda harus menggunakan POST jika ada banyak data, atau semacam informasi sensitif (hal yang sangat sensitif memerlukan koneksi yang aman juga).

Gunakan DAPATKAN jika Anda ingin orang dapat mem-bookmark halaman Anda, karena semua data disertakan dengan bookmark.

Berhati-hatilah terhadap orang-orang yang memukul REFRESH dengan metode GET, karena data akan dikirim lagi setiap kali tanpa memperingatkan pengguna (POST terkadang memperingatkan pengguna tentang pengiriman kembali data).


Jika titik akhir menerima file dan mengembalikan garis dari file (tidak ada pembuatan atau perubahan data atau database yang terlibat), maka apakah titik akhir harus DAPATKAN atau POST?
variabel

@Variable POST. Dalam hal ini, sebagian besar karena POST dibangun untuk menangani unggahan file dan GET standar tidak. Anda harus mengirim file setiap kali halaman dimuat, jadi masuk akal untuk menggunakan POST standar alih-alih file GET + yang akan mematahkan harapan GET bahwa URL harus memberikan hasil yang sama kurang lebih sama setiap kali.
Berikan

14

Dokumen W3C ini menjelaskan penggunaan HTTP GET dan POST.

Saya pikir ini adalah sumber yang otoritatif.

Ringkasannya adalah (bagian 1.3 dari dokumen):

  • Gunakan DAPATKAN jika interaksi lebih seperti pertanyaan (yaitu, itu adalah operasi yang aman seperti permintaan, operasi baca, atau pencarian).
  • Gunakan POST jika:
    • Interaksi lebih seperti pesanan, atau
    • Interaksi mengubah keadaan sumber daya dengan cara yang akan dirasakan pengguna (misalnya, berlangganan layanan), atau
    • Pengguna bertanggung jawab atas hasil interaksi.

9
Saya pikir itu dapat diringkas lebih lanjut sebagai berikut: DAPATKAN ketika keadaan server tidak berubah, POST saat itu.
Yamcha

10

Metode Dapatkan dan Posting tidak ada hubungannya dengan teknologi server yang Anda gunakan, kerjanya sama di php, asp.net atau ruby. GET dan POST adalah bagian dari protokol HTTP. Seperti yang telah dicatat, POST lebih aman. Formulir POST juga tidak di-cache oleh browser. POST juga digunakan untuk mentransfer data dalam jumlah besar.


8

Alasan menggunakan POST saat membuat perubahan data:

  • Akselerator web seperti Google Web Accelerator akan mengklik semua tautan (GET) pada halaman dan menyimpannya. Ini sangat buruk jika tautan membuat perubahan pada beberapa hal.
  • Peramban menyimpan permintaan GET jadi meskipun pengguna mengklik tautan itu mungkin tidak mengirim permintaan ke server untuk melakukan perubahan.
  • Untuk melindungi situs / aplikasi Anda dari CSRF, Anda harus menggunakan POST. Untuk benar-benar mengamankan aplikasi Anda, Anda juga harus menghasilkan pengidentifikasi unik di server dan mengirimkannya bersama dalam permintaan.

Selain itu, jangan masukkan informasi sensitif dalam string kueri (hanya opsi dengan GET) karena muncul di bilah alamat, bookmark, dan log server.

Semoga ini menjelaskan mengapa orang mengatakan POST 'aman'. Jika Anda mengirim data sensitif, Anda harus menggunakan SSL.


8

GETdan POSTmerupakan metode HTTP yang dapat mencapai tujuan serupa

GETpada dasarnya hanya untuk mendapatkan (mengambil) data, A GETtidak boleh memiliki badan, jadi selain dari cookie, satu-satunya tempat untuk menyampaikan info adalah di URL dan URL panjangnya terbatas, GETkurang aman dibandingkan dengan POSTkarena data yang dikirim adalah bagian dari URL

Jangan pernah gunakan GETsaat mengirim kata sandi, kartu kredit, atau informasi sensitif lainnya !, Data dapat dilihat oleh semua orang di URL, Dapat di-cache data. GETtidak berbahaya ketika kita memuat ulang atau memanggil tombol kembali, itu akan ditandai buku, parameter tetap dalam riwayat browser, hanya karakter ASCII yang diizinkan.

POSTdapat melibatkan apa saja, seperti menyimpan atau memperbarui data, atau memesan produk, atau mengirim email. POSTMetode memiliki tubuh.

POSTmetode diamankan untuk meneruskan informasi sensitif dan rahasia ke server tidak akan terlihat dalam parameter kueri di URL dan parameter tidak disimpan dalam riwayat peramban. Tidak ada batasan panjang data. Saat kami memuat ulang, peramban harus memberi tahu pengguna bahwa data akan dikirimkan kembali. POSTmetode tidak dapat di-bookmark


3
  1. Metode GET digunakan untuk mengirim data yang kurang sensitif sedangkan metode POST digunakan untuk mengirim data sensitif.
  2. Menggunakan metode POST Anda dapat mengirim data dalam jumlah besar dibandingkan dengan metode GET.
  3. Data yang dikirim dengan metode GET terlihat di bilah header browser sedangkan data yang dikirim dengan metode POST tidak terlihat.

0

Gunakan metode GET jika Anda ingin mengambil sumber dari URL. Anda selalu dapat melihat halaman terakhir jika Anda menekan tombol kembali browser Anda, dan itu bisa di-bookmark, sehingga tidak seaman metode POST.

Gunakan metode POST jika Anda ingin 'mengirimkan' sesuatu ke URL. Misalnya Anda ingin membuat akun google dan Anda mungkin perlu mengisi semua informasi terperinci, maka Anda menekan tombol 'kirim' (metode POST disebut di sini), setelah Anda berhasil mengirim, dan mencoba menekan tombol kembali browser Anda , Anda akan mendapatkan kesalahan atau formulir kosong baru, bukan halaman terakhir dengan formulir yang diisi.


-10

The GETMetode:

  • Ini hanya digunakan untuk mengirim tanggal 256 karakter

  • Saat menggunakan metode ini, informasi dapat dilihat di browser

  • Ini adalah metode default yang digunakan oleh formulir

  • Tidak begitu aman.


The POSTMetode:

  • Ini digunakan untuk mengirim data tanpa batas.

  • Dengan metode ini, informasi tidak dapat dilihat di browser

  • Anda dapat menyebutkan POSTmetode secara eksplisit

  • Itu lebih terjamin daripada GETmetode

  • Ini menyediakan fitur yang lebih canggih


"Ini digunakan hanya untuk mengirim tanggal 256 karakter" - tidak benar. "Saat menggunakan metode ini, informasinya dapat dilihat di browser" - memposting data juga terlihat di browser, itu tidak begitu jelas. "Ini menyediakan fitur yang lebih canggih" - seperti?
Quentin

Ini bukan jawaban yang sangat berguna. Informasi yang salah seperti 'tidak aman' dan 'menyediakan fitur yang lebih canggih', dan hal-hal lain yang disebutkan oleh Quentin.
Andrew Barber
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.