Ada kasus ketiga, kau tahu. !isset($_REQUEST['s']).
Franz
5
Seberapa pentingkah orang lain memahami kode Anda dengan jelas? POST dan GET bersifat eksplisit, sedangkan REQUEST dapat berasal dari berbagai sumber. Saya pikir efisiensi dapat diabaikan karena PERMINTAAN, POST, dan GET superglobals selalu dimuat untuk setiap permintaan.
Kevin
Jawaban:
273
$_REQUEST, secara default, berisi konten $_GET, $_POSTdan $_COOKIE.
Tapi itu hanya default, yang tergantung pada variables_order; dan tidak yakin Anda ingin bekerja dengan cookie.
Jika saya harus memilih, saya mungkin tidak akan menggunakan $_REQUEST, dan saya akan memilih $_GETatau $_POST- tergantung pada apa yang harus dilakukan aplikasi saya (yaitu satu atau yang lain, tetapi tidak keduanya) : secara umum:
Anda harus menggunakan $_GETketika seseorang meminta data dari aplikasi Anda.
Dan Anda harus menggunakan $_POSTketika seseorang mendorong (memasukkan atau memperbarui; atau menghapus) data ke aplikasi Anda.
Either way, tidak akan ada banyak perbedaan tentang pertunjukan: perbedaan akan diabaikan, dibandingkan dengan apa yang akan dilakukan skrip Anda yang lain.
Idealnya, Anda harus selalu dapat menggunakan $ _REQUEST. Tapi itu tentu saja hanya dunia yang sempurna.
Tyler Carter
2
$ _REQUEST seharusnya (atau setidaknya dulu) lebih mahal daripada menggunakan $ _POST dan $ _GET secara langsung.
Darrell Brogdon
3
+1 untuk konsep perbedaan kinerja yang dapat diabaikan dan perspektif pemeliharaan menjadi lebih penting: $ _GET dan $ _POST menyampaikan makna dengan cara yang tidak bisa dilakukan $ _REQUEST.
Jon Cram
9
Menggunakan $ _REQUEST tidak menyebabkan XSS / XSRF. Tidak memahami nuansa XSS / XSRF menyebabkan XSS / XSRF. Selama Anda melakukan mitigasi dengan token, tidak ada masalah DAN Anda mendapatkan manfaat menggunakan $ _REQUEST (semua variabel Anda berada dalam satu superglobal). Saya benar-benar membangun kembali $ _REQUEST sebelum menggunakannya berdasarkan superglobals lain karena 'variabel_order'. Saya memproses $ _COOKIE, lalu $ _GET, lalu $ _POST. Dengan cara itu POST vars memiliki prioritas tertinggi dan vars cookie mendapatkan yang terendah, yang memungkinkan saya untuk memperbaiki sejumlah bug (misalnya Adobe Flash dan kutipan ajaib).
CubicleSoft
itu dalam nama, Dapatkan = dapatkan dari, Posting = posting ke
Grumpy
32
DAPATKAN vs. POST
1) Baik GET dan POST membuat array (mis. Array (key => value, key2 => value2, key3 => value3, ...)). Array ini menampung pasangan kunci / nilai, di mana kunci adalah nama kontrol formulir dan nilai adalah input data dari pengguna.
2) GET dan POST diperlakukan sebagai $ _GET dan $ _POST. Ini adalah superglobals, yang berarti mereka selalu dapat diakses, terlepas dari ruang lingkup - dan Anda dapat mengaksesnya dari fungsi, kelas atau file apa pun tanpa harus melakukan sesuatu yang istimewa.
3) $ _GET adalah array variabel yang diteruskan ke skrip saat ini melalui parameter URL.
4) $ _POST adalah array variabel yang diteruskan ke skrip saat ini melalui metode HTTP POST.
Kapan harus menggunakan GET?
Informasi yang dikirim dari formulir dengan metode GET dapat dilihat oleh semua orang (semua nama dan nilai variabel ditampilkan dalam URL). GET juga memiliki batasan jumlah informasi yang akan dikirim. Batasannya sekitar 2000 karakter. Namun, karena variabel ditampilkan di URL, dimungkinkan untuk menandai halaman tersebut. Ini dapat bermanfaat dalam beberapa kasus.
GET dapat digunakan untuk mengirim data yang tidak sensitif.
Catatan: JANGAN PERNAH digunakan untuk mengirim kata sandi atau informasi sensitif lainnya!
Kapan menggunakan POST?
Informasi yang dikirim dari formulir dengan metode POST tidak terlihat oleh orang lain (semua nama / nilai tertanam di dalam tubuh permintaan HTTP) dan tidak memiliki batasan pada jumlah informasi yang akan dikirim.
Selain itu POST mendukung fungsionalitas tingkat lanjut seperti dukungan untuk input biner multi-bagian saat mengunggah file ke server.
Namun, karena variabel tidak ditampilkan dalam URL, tidak mungkin untuk mem-bookmark halaman.
Silakan tambahkan sesuatu tentang PERMINTAAN juga.
Black Mamba
Bagaimana dengan $ _REQUEST?
Aamir Kalimi
22
$ _GET mengambil variabel dari querystring, atau URL Anda.>
$ _POST mengambil variabel dari metode POST, seperti formulir (umumnya).
$ _REQUEST adalah penggabungan $ _GET dan $ _POST di mana $ _POST menimpa $ _GET. Baik untuk menggunakan $ _REQUEST pada formulir referensi diri untuk validasi.
+1 Ini pada dasarnya adalah apa yang diajarkan kepada saya. Tidak teknis seperti jawaban lain, tetapi lebih mudah diingat ( GETdari string kueri, POSTdari pengiriman formulir).
jp2code
18
Saya sarankan menggunakan $_POSTdan $_GETsecara eksplisit.
Menggunakan $ _REQUEST seharusnya tidak perlu dengan desain situs yang tepat, dan itu datang dengan beberapa kelemahan seperti membuat Anda terbuka untuk CSRF/XSSserangan yang lebih mudah dan kekonyolan lainnya yang berasal dari menyimpan data dalam URL.
Jawaban yang bagus, dengan peringatan bahwa dalam banyak situasi GET atau POST harus dipilih berdasarkan situasi alih-alih menggunakan salah satu.
ceejayoz
3
Anda benar bahwa tidak ada yang peduli, tetapi menurut saya menggunakan $_REQUESTkesimpulan yang salah. Lihat jawaban saya.
Franz
4
mengapa menggunakan $ _REQUEST lebih bersih dibandingkan dengan $ _GET atau $ _POST? $ _REQUEST melakukan logika yang sama di belakang layar dan memilih GET atau POST memberi Anda lebih banyak kontrol.
Jay Zeng
6
Klaim bahwa _REQUEST lebih higienis perlu dijabarkan.
2
Saya akan merekomendasikan menggunakan GET jika Anda ingin pengguna dapat menyalin URL dan membentuk operasi yang sama yaitu (URL itu terlihat seperti 'google.com/q=searchWord' sementara POST harus digunakan untuk mengirim data ke situs web yang seharusnya hanya disisipkan satu kali, atau banyak data aktif dan pengguna seharusnya tidak dapat menjaga url seperti memasukkan data dalam database, masuk dll.
Dean Meehan
7
Jangan khawatir. Tetapi Anda masih harus menggunakan solusi kedua (ditambah pemeriksaan tambahan untuk tidak ada variabel-variabel yang ada), karena ada masalah keamanan dengan $_REQUEST(karena $_GETdan $_POSTbukan satu-satunya sumber untuk array itu).
Ada posting tentang masalah dengan $_REQUESTkemarin, saya percaya. Biarkan aku menemukannya.
Bukan solusi yang buruk sama sekali. Ini menangani kelemahan keamanan yang terkait dengan $_REQUESTtetapi masih memungkinkan skrip yang sama untuk diakses dengan cara baik (dalam kasus saya, skrip yang sama digunakan dengan 'tindakan' yang berbeda dan beberapa kali $ _GET akan baik-baik saja, tetapi di lain waktu saya membutuhkan $ _POST untuk menyembunyikan / mengamankan data).
Xandor
4
Ada masalah keamanan tertentu yang terlibat karena seorang peretas dapat menetapkan cookie yang akan menimpa nilai $ _POST atau $ _GET. Jika Anda menangani data sensitif, saya tidak akan merekomendasikan menggunakan $ _REQUEST. - Xandor
Anda tidak dapat digunakan sebagai $_GETalternatif$_POST pada beberapa kasus.
Kapan ??
ketika Anda ingin mengunggah file.
ketika Anda tidak ingin menampilkan data dalam url.
GETjuga memiliki batasan jumlah informasi yang akan dikirim. Batasannya sekitar 2000 karakter.
Hal lain ada beberapa kasus ketika Anda tidak dapat mengambil data menggunakan $_POST
Kapan ?
ketika data dikirimkan dalam URL.
Untuk Layanan Istirahat
`GET`-Provides a read only access to a resource.`PUT`-Used to create a new resource.
tidak ada yang salah untuk digunakan $_REQUEST.
Tetapi cara untuk melakukannya adalah dengan memeriksa $ _SERVER ['REQUEST_METHOD'] secara eksplisit, tidak bergantung pada $ _POST yang kosong untuk GET.
Saran yang baik tentang penggunaan $_SERVER['REQUEST_METHOD']untuk memeriksa apakah skrip akan dipanggil dengan salah satunya. Tetapi untuk mengatakan tidak ada yang salah dengan $_REQUESTitu tidak 100% benar. Ada masalah keamanan tertentu yang terlibat karena seorang peretas dapat menetapkan cookie yang akan menimpa nilai $ _POST atau $ _GET. Jika Anda menangani data sensitif, saya tidak akan merekomendasikan menggunakan $_REQUEST.
Xandor
Saya telah menambahkan komentar Anda dalam jawaban saya itu buat bantuan terima kasih
Parth Chavda
3
$ _GET mengambil variabel dari querystring, atau URL Anda.>
$ _POST mengambil variabel dari metode POST, seperti formulir (umumnya).
$ _REQUEST adalah penggabungan $ _GET dan $ _POST di mana $ _POST menimpa $ _GET. Baik untuk menggunakan $ _REQUEST pada formulir referensi diri untuk validasi.
Saya pernah melihat ini sebelumnya, dengan GEThanya digunakan untuk satu item (misalnya memindahkannya) dan POSTuntuk beberapa item ( formulir dengan kotak centang ...).
Franz
1
Saya hanya pernah menggunakan _GET atau _POST. Saya lebih suka memiliki kontrol.
Apa yang saya tidak suka tentang salah satu fragmen kode dalam OP adalah bahwa mereka membuang informasi yang menggunakan metode HTTP. Dan informasi itu penting untuk sanitasi input.
Misalnya, jika skrip menerima data dari formulir yang akan dimasukkan ke dalam DB maka formulir sebaiknya menggunakan POST ( gunakan GET hanya untuk tindakan idempoten ). Tetapi jika skrip menerima input data melalui metode GET maka harus (biasanya) ditolak. Bagi saya, situasi seperti itu mungkin menuntut penulisan pelanggaran keamanan ke log kesalahan karena itu pertanda seseorang sedang mencoba sesuatu.
Dengan salah satu fragmen kode dalam OP, sanitasi ini tidak akan mungkin.
Sebenarnya, sangat mudah untuk menulis halaman kecil yang memposting apa pun yang Anda inginkan ke halaman. Jadi, kecuali jika Anda mengandalkan header pengarah yang dikirim, pos vars tidak lebih aman daripada mendapatkan vars. Saya kira keuntungan terbesar dari eksplisit $_POSTadalah untuk mencegah crawler mesin pencari melakukan sesuatu seperti ini: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Duroth
Saya mengatakan tidak sebaliknya. Apa yang saya katakan adalah bahwa jika formulir HTML menggunakan POST dan penanganan skrip menerima data formulir melalui GET maka skrip ingin tahu tentang hal itu dan tidak membuang fakta itu, seperti contoh kedua kobra lakukan. (Btw: pengarah juga tidak aman.)
1
Saya akan menggunakan $_POST, dan $_GETkarena berbeda dari $_REQUESTkonten mereka tidak dipengaruhi oleh variables_order.
Kapan menggunakan $_POSTdan $_GETtergantung pada jenis operasi apa yang sedang dijalankan. Operasi yang mengubah data yang ditangani dari server harus dilakukan melalui permintaan POST, sedangkan operasi lain harus dilakukan melalui permintaan GET. Untuk membuat contoh, operasi yang menghapus akun pengguna tidak boleh langsung dieksekusi setelah pengguna mengklik tautan, saat melihat gambar dapat dilakukan melalui tautan.
pernyataan tersebut memvalidasi jika $ _REQUEST memiliki lebih dari satu parameter (parameter pertama dalam $ _REQUEST akan menjadi permintaan uri yang dapat digunakan saat dibutuhkan, beberapa paket PHP tidak akan mengembalikan $ _GET jadi periksa apakah lebih dari 1 bernilai $ _GET, By default, itu akan menjadi $ _POST.
Anda terlalu dini mengoptimalkan. Juga, Anda harus benar-benar memikirkan apakah GET harus digunakan untuk hal-hal yang Anda POST, karena alasan keamanan.
Tolong jangan mencoba untuk memberitahu rakyat bahwa ada sesuatu yang lebih aman tentang POST daripada tentang GET.
Aku tidak. Intinya adalah bahwa penggunaannya harus dipikirkan dan tidak secara terang-terangan digunakan secara bergantian, karena "hanya mengetik REQUEST jauh lebih mudah".
Alex Brasetvik
Jika yang Anda maksud adalah bahwa kobra harus memeriksa bahwa data telah dikirim menggunakan metode yang diharapkan, maka saya setuju. Salah satu dari contoh kodenya membuat pengujian seperti itu tidak mungkin.
0
Ini jelek dan saya tidak akan merekomendasikan itu sebagai solusi akhir ketika mendorong kode langsung, tetapi sementara membangun fungsi istirahat, kadang-kadang berguna untuk memiliki parameter grabber 'catch-all':
Seseorang yang kreatif mungkin bahkan dapat menambahkannya untuk menangani parameter baris perintah atau apa pun yang berasal dari IDE Anda. Setelah Anda memutuskan apa fungsi istirahat yang diberikan lakukan, Anda dapat memilih satu yang sesuai untuk panggilan yang diberikan untuk memastikan Anda mendapatkan apa yang Anda butuhkan untuk versi penyebaran. Ini mengasumsikan 'REQUEST_METHOD' diatur.
!isset($_REQUEST['s'])
.Jawaban:
$_REQUEST
, secara default, berisi konten$_GET
,$_POST
dan$_COOKIE
.Tapi itu hanya default, yang tergantung pada
variables_order
; dan tidak yakin Anda ingin bekerja dengan cookie.Jika saya harus memilih, saya mungkin tidak akan menggunakan
$_REQUEST
, dan saya akan memilih$_GET
atau$_POST
- tergantung pada apa yang harus dilakukan aplikasi saya (yaitu satu atau yang lain, tetapi tidak keduanya) : secara umum:$_GET
ketika seseorang meminta data dari aplikasi Anda.$_POST
ketika seseorang mendorong (memasukkan atau memperbarui; atau menghapus) data ke aplikasi Anda.Either way, tidak akan ada banyak perbedaan tentang pertunjukan: perbedaan akan diabaikan, dibandingkan dengan apa yang akan dilakukan skrip Anda yang lain.
sumber
DAPATKAN vs. POST
1) Baik GET dan POST membuat array (mis. Array (key => value, key2 => value2, key3 => value3, ...)). Array ini menampung pasangan kunci / nilai, di mana kunci adalah nama kontrol formulir dan nilai adalah input data dari pengguna.
2) GET dan POST diperlakukan sebagai $ _GET dan $ _POST. Ini adalah superglobals, yang berarti mereka selalu dapat diakses, terlepas dari ruang lingkup - dan Anda dapat mengaksesnya dari fungsi, kelas atau file apa pun tanpa harus melakukan sesuatu yang istimewa.
3) $ _GET adalah array variabel yang diteruskan ke skrip saat ini melalui parameter URL.
4) $ _POST adalah array variabel yang diteruskan ke skrip saat ini melalui metode HTTP POST.
Kapan harus menggunakan GET?
Informasi yang dikirim dari formulir dengan metode GET dapat dilihat oleh semua orang (semua nama dan nilai variabel ditampilkan dalam URL). GET juga memiliki batasan jumlah informasi yang akan dikirim. Batasannya sekitar 2000 karakter. Namun, karena variabel ditampilkan di URL, dimungkinkan untuk menandai halaman tersebut. Ini dapat bermanfaat dalam beberapa kasus.
GET dapat digunakan untuk mengirim data yang tidak sensitif.
Catatan: JANGAN PERNAH digunakan untuk mengirim kata sandi atau informasi sensitif lainnya!
Kapan menggunakan POST?
Informasi yang dikirim dari formulir dengan metode POST tidak terlihat oleh orang lain (semua nama / nilai tertanam di dalam tubuh permintaan HTTP) dan tidak memiliki batasan pada jumlah informasi yang akan dikirim.
Selain itu POST mendukung fungsionalitas tingkat lanjut seperti dukungan untuk input biner multi-bagian saat mengunggah file ke server.
Namun, karena variabel tidak ditampilkan dalam URL, tidak mungkin untuk mem-bookmark halaman.
sumber
sumber
GET
dari string kueri,POST
dari pengiriman formulir).Saya sarankan menggunakan
$_POST
dan$_GET
secara eksplisit.Menggunakan $ _REQUEST seharusnya tidak perlu dengan desain situs yang tepat, dan itu datang dengan beberapa kelemahan seperti membuat Anda terbuka untuk
CSRF/XSS
serangan yang lebih mudah dan kekonyolan lainnya yang berasal dari menyimpan data dalam URL.Perbedaan kecepatan harus minimal.
sumber
Gunakan PERMINTAAN. Tidak ada yang peduli tentang kecepatan operasi yang begitu sederhana, dan itu kode yang jauh lebih bersih.
sumber
$_REQUEST
kesimpulan yang salah. Lihat jawaban saya.Jangan khawatir. Tetapi Anda masih harus menggunakan solusi kedua (ditambah pemeriksaan tambahan untuk tidak ada variabel-variabel yang ada), karena ada masalah keamanan dengan
$_REQUEST
(karena$_GET
dan$_POST
bukan satu-satunya sumber untuk array itu).Ada posting tentang masalah dengan
$_REQUEST
kemarin, saya percaya. Biarkan aku menemukannya.EDIT : Oh well, bukan posting secara langsung, tapi ini dia: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html
sumber
Gunakan itu karena lebih aman dan tidak akan membuat perbedaan kecepatan yang terlihat
sumber
$_REQUEST
tetapi masih memungkinkan skrip yang sama untuk diakses dengan cara baik (dalam kasus saya, skrip yang sama digunakan dengan 'tindakan' yang berbeda dan beberapa kali $ _GET akan baik-baik saja, tetapi di lain waktu saya membutuhkan $ _POST untuk menyembunyikan / mengamankan data).Ada masalah keamanan tertentu yang terlibat karena seorang peretas dapat menetapkan cookie yang akan menimpa nilai $ _POST atau $ _GET. Jika Anda menangani data sensitif, saya tidak akan merekomendasikan menggunakan $ _REQUEST. - Xandor
Anda tidak dapat digunakan sebagai
$_GET
alternatif$_POST
pada beberapa kasus.Kapan ??
GET
juga memiliki batasan jumlah informasi yang akan dikirim. Batasannya sekitar 2000 karakter.Hal lain ada beberapa kasus ketika Anda tidak dapat mengambil data menggunakan
$_POST
Kapan ?
Untuk Layanan Istirahat
tidak ada yang salah untuk digunakan
$_REQUEST
.Tetapi cara untuk melakukannya adalah dengan memeriksa $ _SERVER ['REQUEST_METHOD'] secara eksplisit, tidak bergantung pada $ _POST yang kosong untuk GET.
sumber
$_SERVER['REQUEST_METHOD']
untuk memeriksa apakah skrip akan dipanggil dengan salah satunya. Tetapi untuk mengatakan tidak ada yang salah dengan$_REQUEST
itu tidak 100% benar. Ada masalah keamanan tertentu yang terlibat karena seorang peretas dapat menetapkan cookie yang akan menimpa nilai $ _POST atau $ _GET. Jika Anda menangani data sensitif, saya tidak akan merekomendasikan menggunakan$_REQUEST
.$ _GET mengambil variabel dari querystring, atau URL Anda.>
$ _POST mengambil variabel dari metode POST, seperti formulir (umumnya).
$ _REQUEST adalah penggabungan $ _GET dan $ _POST di mana $ _POST menimpa $ _GET. Baik untuk menggunakan $ _REQUEST pada formulir referensi diri untuk validasi.
sumber
request_order
dan mungkin mengandung nilai cookie juga, itulah sebabnya itu bukan fitur yang sangat andal atau berguna.Saya akan menggunakan metode kedua karena lebih eksplisit. Kalau tidak, Anda tidak tahu dari mana variabel itu berasal.
Mengapa Anda perlu memeriksa GET dan POST? Tentunya menggunakan satu atau yang lain hanya lebih masuk akal.
sumber
GET
hanya digunakan untuk satu item (misalnya memindahkannya) danPOST
untuk beberapa item ( formulir dengan kotak centang ...).Saya hanya pernah menggunakan _GET atau _POST. Saya lebih suka memiliki kontrol.
Apa yang saya tidak suka tentang salah satu fragmen kode dalam OP adalah bahwa mereka membuang informasi yang menggunakan metode HTTP. Dan informasi itu penting untuk sanitasi input.
Misalnya, jika skrip menerima data dari formulir yang akan dimasukkan ke dalam DB maka formulir sebaiknya menggunakan POST ( gunakan GET hanya untuk tindakan idempoten ). Tetapi jika skrip menerima input data melalui metode GET maka harus (biasanya) ditolak. Bagi saya, situasi seperti itu mungkin menuntut penulisan pelanggaran keamanan ke log kesalahan karena itu pertanda seseorang sedang mencoba sesuatu.
Dengan salah satu fragmen kode dalam OP, sanitasi ini tidak akan mungkin.
sumber
$_POST
adalah untuk mencegah crawler mesin pencari melakukan sesuatu seperti ini: thedailywtf.com/Articles/WellIntentioned-Destruction.aspxSaya akan menggunakan
$_POST
, dan$_GET
karena berbeda dari$_REQUEST
konten mereka tidak dipengaruhi olehvariables_order
.Kapan menggunakan
$_POST
dan$_GET
tergantung pada jenis operasi apa yang sedang dijalankan. Operasi yang mengubah data yang ditangani dari server harus dilakukan melalui permintaan POST, sedangkan operasi lain harus dilakukan melalui permintaan GET. Untuk membuat contoh, operasi yang menghapus akun pengguna tidak boleh langsung dieksekusi setelah pengguna mengklik tautan, saat melihat gambar dapat dilakukan melalui tautan.sumber
Saya menggunakan ini,
pernyataan tersebut memvalidasi jika $ _REQUEST memiliki lebih dari satu parameter (parameter pertama dalam $ _REQUEST akan menjadi permintaan uri yang dapat digunakan saat dibutuhkan, beberapa paket PHP tidak akan mengembalikan $ _GET jadi periksa apakah lebih dari 1 bernilai $ _GET, By default, itu akan menjadi $ _POST.
sumber
Anda terlalu dini mengoptimalkan. Juga, Anda harus benar-benar memikirkan apakah GET harus digunakan untuk hal-hal yang Anda POST, karena alasan keamanan.
sumber
Ini jelek dan saya tidak akan merekomendasikan itu sebagai solusi akhir ketika mendorong kode langsung, tetapi sementara membangun fungsi istirahat, kadang-kadang berguna untuk memiliki parameter grabber 'catch-all':
Seseorang yang kreatif mungkin bahkan dapat menambahkannya untuk menangani parameter baris perintah atau apa pun yang berasal dari IDE Anda. Setelah Anda memutuskan apa fungsi istirahat yang diberikan lakukan, Anda dapat memilih satu yang sesuai untuk panggilan yang diberikan untuk memastikan Anda mendapatkan apa yang Anda butuhkan untuk versi penyebaran. Ini mengasumsikan 'REQUEST_METHOD' diatur.
sumber