Di antara $ _REQUEST, $ _GET dan $ _POST mana yang tercepat?

177

Manakah dari kode ini yang lebih cepat?

$temp = $_REQUEST['s'];

atau

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}
Kobra
sumber
6
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.

Pascal MARTIN
sumber
1
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.

Zee Ken
sumber
6
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.

Gewel
sumber
3
+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.

Perbedaan kecepatan harus minimal.

Daniel Bruce
sumber
8

Gunakan PERMINTAAN. Tidak ada yang peduli tentang kecepatan operasi yang begitu sederhana, dan itu kode yang jauh lebih bersih.

Steven Schlansker
sumber
7
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.

EDIT : Oh well, bukan posting secara langsung, tapi ini dia: http://kuza55.blogspot.com/2006/03/request-variable-fixation.html

Franz
sumber
6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

Gunakan itu karena lebih aman dan tidak akan membuat perbedaan kecepatan yang terlihat

Kristina Brooks
sumber
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.

Parth Chavda
sumber
1
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.

krunal panchal
sumber
2
Overriding tergantung pada request_orderdan mungkin mengandung nilai cookie juga, itulah sebabnya itu bukan fitur yang sangat andal atau berguna.
Ja͢ck
1

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
1
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.


sumber
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.

kiamlaluno
sumber
1

Saya menggunakan ini,

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

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.

Cosmo Arun
sumber
0

Anda terlalu dini mengoptimalkan. Juga, Anda harus benar-benar memikirkan apakah GET harus digunakan untuk hal-hal yang Anda POST, karena alasan keamanan.

Alex Brasetvik
sumber
3
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':

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

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.

Scott
sumber