Saya telah melihat sejumlah posting di sini yang mengatakan untuk tidak menggunakan $_REQUEST
variabel. Biasanya saya tidak melakukannya, tetapi terkadang lebih nyaman. Apakah ada yang salah?
php
methods
form-submit
sprugman
sumber
sumber
$_REQUEST
. Lihat php.net/request_order Saya baru saja tersandung pada jeda kompatibilitas mundur ini ketika mengharapkan data cookie masuk$_REQUEST
dan bertanya-tanya mengapa itu tidak berfungsi! Jadi, alasan terbesar untuk menghindari penggunaan $ _REQUEST adalah karena skrip Anda tidak dapat disetelrequest_order
sendiriPHP_INI_PERDIR
, jadi perubahan php.ini dapat dengan mudah mematahkan asumsi yang menjadi dasar pembuatan skrip Anda. Lebih baik memasukkan asumsi tersebut langsung ke dalam naskah Anda.Jawaban:
Sama sekali tidak ada yang salah dengan mengambil masukan dari keduanya
$_GET
dan$_POST
dengan cara gabungan. Faktanya, itulah yang hampir selalu ingin Anda lakukan:untuk permintaan idempoten biasa yang biasanya dikirimkan melalui GET, ada kemungkinan jumlah data yang Anda inginkan tidak akan muat dalam URL sehingga telah dimutasi menjadi permintaan POST sebagai masalah praktis.
untuk permintaan yang memiliki efek nyata, Anda harus memeriksa apakah permintaan tersebut dikirim dengan metode POST. Tetapi cara untuk melakukannya adalah dengan memeriksa
$_SERVER['REQUEST_METHOD']
secara eksplisit, tidak bergantung pada$_POST
kekosongan untuk GET. Dan bagaimanapun, jika metodenya adalahPOST
, Anda mungkin masih ingin mengambil beberapa parameter kueri dari URL.Tidak, masalah dengan
$_REQUEST
tidak ada hubungannya dengan parameter GET dan POST yang digabungkan. Itu juga, secara default, termasuk$_COOKIE
. Dan cookie sama sekali tidak seperti parameter pengiriman formulir: Anda hampir tidak pernah ingin memperlakukannya sebagai hal yang sama.Jika Anda tidak sengaja mendapatkan cookie yang ditetapkan di situs Anda dengan nama yang sama dengan salah satu parameter formulir Anda, formulir yang mengandalkan parameter tersebut akan berhenti bekerja secara misterius karena nilai cookie menimpa parameter yang diharapkan. Ini sangat mudah dilakukan jika Anda memiliki banyak aplikasi di situs yang sama, dan bisa sangat sulit untuk di-debug ketika Anda hanya memiliki beberapa pengguna dengan cookie lama, Anda tidak lagi menggunakannya untuk berkeliaran dan merusak formulir dengan cara tidak -tidak ada yang bisa mereproduksi.
Anda dapat mengubah perilaku ini menjadi urutan yang lebih masuk akal
GP
(tidakC
) dengan konfigurasi request_order di PHP 5.3. Jika hal ini tidak memungkinkan, saya pribadi akan menghindari$_REQUEST
dan, jika saya membutuhkan gabungan GET + POST array, buat secara manual.sumber
a="foo"
dan $ _COOKIEa="bar"
, apakah akan ada penggantian / konflik di sini?Saya telah menggali beberapa posting newsgroup di PHP Internals dan menemukan diskusi menarik tentang topik tersebut. Thread awal adalah tentang sesuatu yang lain, tapi pernyataan oleh Stefan Esser, (jika tidak dalam ) ahli keamanan di dunia PHP berubah diskusi terhadap implikasi keamanan menggunakan $ _REQUEST untuk beberapa posting.
Mengutip Stefan Esser di PHP Internals
dan di balasan nanti ke utas yang sama
Pembahasan berlanjut hingga beberapa postingan lagi dan menarik untuk dibaca.
Seperti yang Anda lihat, masalah utama dengan $ _REQUEST bukanlah karena ia memiliki data dari $ _GET dan $ _POST, tetapi juga dari $ _COOKIE. Beberapa orang lain dalam daftar menyarankan untuk mengubah urutan pengisian $ _REQUEST, misalnya mengisinya dengan $ _COOKIE terlebih dahulu, tetapi hal ini dapat menyebabkan banyak masalah potensial lainnya, misalnya dengan penanganan Sesi .
Anda dapat sepenuhnya menghilangkan $ _COOKIES dari $ _REQUEST global, sehingga tidak ditimpa oleh array lain (sebenarnya, Anda dapat membatasinya ke kombinasi apa pun dari konten standarnya, seperti manual PHP pada pengaturan variabel_order ini memberitahu kami:
Tetapi sekali lagi, Anda mungkin juga mempertimbangkan untuk tidak menggunakan $ _REQUEST sama sekali, hanya karena di PHP Anda dapat mengakses Environment, Get, Post, Cookie, dan Server di global mereka sendiri dan mengurangi satu vektor serangan. Anda masih harus membersihkan data ini, tetapi ada satu hal yang perlu dikhawatirkan.
Sekarang Anda mungkin bertanya-tanya, mengapa $ _REQUEST ada dan mengapa itu tidak dihapus. Ini juga ditanyakan pada PHP Internal. Mengutip Rasmus Lerdorf tentang Mengapa $ _REQUEST ada? di Internal PHP
Bagaimanapun, harapan itu memberi sedikit cahaya.
sumber
$_REQUEST
mengacu pada semua jenis permintaan (GET, POST, dll ..). Ini terkadang berguna, tetapi biasanya lebih baik untuk menentukan metode yang tepat ($ _GET, $ _POST dll).sumber
$_REQUEST
umumnya dianggap berbahaya karena alasan yang sama bahwa transformasi data dengan kompleksitas sederhana hingga menengah sering dilakukan dalam kode aplikasi alih-alih dideklarasikan dalam SQL: beberapa pemrogram payah.Dengan demikian, jika seseorang cenderung menggunakan di
$_REQUEST
mana-mana, saya dapat melakukan apa saja melalui GET yang saya bisa melalui POST, yang berarti menyiapkan<img>
tag di situs saya (berbahaya) yang menyebabkan pengguna masuk ke modul e-niaga Anda untuk membeli produk secara diam-diam, atau saya dapat menyebabkan mereka mengeklik tautan yang akan mengakibatkan tindakan berbahaya atau terbukanya informasi sensitif (mungkin bagi saya).Namun, ini karena seorang pemula, atau setidaknya tidak berpengalaman, programmer PHP membuat kesalahan sederhana. Pertama, ketahui kapan data jenis apa yang sesuai. Misalnya, saya memiliki layanan web yang dapat mengembalikan respons dalam URLEncoding, XML atau JSON. Aplikasi memutuskan bagaimana memformat respons dengan memeriksa header HTTP_ACCEPT, tetapi dapat dipaksakan menjadi satu secara khusus dengan mengirimkan
format
parameter.Saat memeriksa konten dari parameter format, itu bisa dikirim melalui querystring atau postdata, tergantung pada banyak faktor, tidak sedikit di antaranya apakah aplikasi pemanggil ingin "& format = json" bercampur dengan permintaannya atau tidak. Dalam hal ini,
$_REQUEST
sangat nyaman karena saya tidak perlu mengetik sesuatu seperti ini:Saya tidak akan mengoceh lebih jauh, tetapi cukup untuk mengatakan bahwa
$_REQUEST
penggunaan tidak dicegah karena secara inheren berbahaya - itu hanya alat lain yang melakukan persis apa yang diminta darinya, apakah Anda memahami implikasi tersebut atau tidak - itu adalah keputusan yang buruk, malas atau kurang informasi dari programmer yang malas, malas atau tidak berpengalaman yang menyebabkan masalah ini.Cara menggunakan
$_REQUEST
dengan amanaddslashes()
atau*_escape_string()
. Akan menampilkannya kembali kepada pengguna?htmlentities()
atauhtmlspecialchars()
. Mengharapkan data numerik?is_numeric()
atauctype_digit()
. Faktanya,filter_input()
dan fungsi terkaitnya dirancang untuk tidak melakukan apa pun selain memeriksa dan membersihkan data. Gunakan alat ini, selalu.$post_clean
. Atau, Anda bisa langsung membersihkannya di superglobals, tetapi alasan saya menganjurkan menggunakan variabel terpisah adalah karena hal itu memudahkan untuk menemukan kerentanan dalam kode, karena apa pun yang mengarah langsung ke superglobal dan bukan yang setara dengan sanitasi dianggap sebagai kesalahan berbahaya. .Sebagai kesimpulan, ingat aturan sederhana ini:
KEAMANAN ADALAH YANG ANDA BUAT, ORANG!
EDIT:
Saya sangat merekomendasikan saran bobince: jika Anda bisa, setel
request_order
parameter di php.ini ke "GP"; artinya, tidak ada komponen cookie. Hampir tidak ada alasan rasional untuk ini dalam 98% + kasus, karena data cookie seharusnya tidak pernah dianggap sebanding dengan querystring atau postdata.PS, Anekdot!
Saya kenal seorang programmer yang memikirkan
$_REQUEST
sebuah tempat untuk menyimpan data yang dapat diakses dengan cara superglobal. Nama pengguna dan kata sandi penting, jalur ke file, sebut saja dan disimpan di$_REQUEST
. Dia agak terkejut (meskipun tidak lucu, sayangnya) ketika saya memberi tahu dia bagaimana variabel itu berperilaku. Tak perlu dikatakan, praktik itu telah digulingkan.sumber
Permintaan GET harus idempoten dan permintaan POST umumnya tidak. Ini berarti bahwa data dalam
$_GET
dan$_POST
umumnya harus digunakan dengan cara yang berbeda.Jika aplikasi Anda menggunakan data dari
$_REQUEST
, itu akan berperilaku sama untuk permintaan GET dan POST, yang melanggar idempotensi GET.sumber
Itu tidak jelas. Anda tidak benar - benar tahu bagaimana data tersebut sampai kepada Anda karena itu membawa data pos, get, dan cookie. Saya tidak selalu berpikir itu selalu hal yang buruk, kecuali jika Anda perlu mengetahui atau membatasi metode pengiriman.
sumber
Saya sebenarnya suka menggunakannya. Ini memberi Anda fleksibilitas untuk menggunakan GET atau POST yang dapat berguna untuk hal-hal seperti formulir pencarian di mana sebagian besar data waktu POST, tetapi terkadang Anda ingin mengatakan tautan ke pencarian tertentu, sehingga Anda dapat menggunakan parameter GET sebagai gantinya .
Juga, jika Anda melihat banyak bahasa lain (ASP.NET misalnya) mereka tidak membedakan sama sekali antara variabel GET dan POST.
ETA :
Saya tidak pernah menggunakan REQUEST untuk mendapatkan nilai COOKIE, tetapi saya pikir Kyle Butt membuat poin yang bagus dalam komentar di posting ini tentang itu. BUKAN ide yang baik untuk menggunakan REQUEST untuk mendapatkan nilai COOKIE. Saya yakin dia benar bahwa ada potensi nyata untuk pemalsuan permintaan lintas situs jika Anda melakukannya.
Selain itu, urutan item dimuat ke REQUEST dikontrol oleh parameter konfigurasi di php.ini (variable_order dan request_order). Jadi, jika Anda memiliki variabel yang sama yang diteruskan melalui POST dan GET, variabel mana yang benar-benar masuk ke REQUEST bergantung pada pengaturan ini. Ini dapat mempengaruhi portabilitas jika Anda bergantung pada urutan tertentu dan pengaturan tersebut dikonfigurasi secara berbeda dari yang Anda harapkan.
sumber
Penting untuk memahami kapan harus menggunakan POST, kapan menggunakan GET dan kapan menggunakan cookie. Dengan $ _REQUEST, nilai yang Anda lihat bisa berasal dari salah satu dari mereka. Jika Anda berharap mendapatkan nilai dari POST atau GET atau dari COOKIE, lebih informatif bagi seseorang yang membaca kode Anda untuk menggunakan variabel spesifik daripada $ _REQUEST.
Orang lain juga menunjukkan bahwa Anda tidak ingin semua POST atau cookie diganti oleh GET karena ada aturan lintas situs yang berbeda untuk semuanya, misalnya, jika Anda mengembalikan data ajax saat menggunakan $ _REQUEST, Anda rentan ke serangan skrip lintas situs.
sumber
$_REQUEST
Bukan ide yang buruk hanya menggunakan waktu dengan GET.Dan bahkan dengan GET,
$_GET
lebih pendek untuk mengetik daripada$_REQUEST
;)sumber
$_POST
ketika penting bahwa datanya menjadi POSTDATA. Satu harus digunakan$_REQUEST
ketika datanya agnostik dengan HTTP Verb yang digunakan. Seseorang harus dalam semua kasus ini dengan hati-hati membersihkan semua data masukan.Saya mungkin digunakan hanya jika Anda ingin mengambil url atau nama host saat ini, tetapi untuk benar-benar mengurai data dari URL tersebut seperti parmeter menggunakan simbol &, mungkin itu bukan ide yang bagus. Secara umum, Anda tidak ingin menggunakan deskripsi yang tidak jelas tentang apa yang Anda coba lakukan. Jika Anda perlu spesifik di situlah $ _REQUEST buruk, jika Anda tidak perlu spesifik maka silakan menggunakannya. Saya akan berpikir.
sumber
$_REQUEST
dengan$_SERVER['QUERY_STRING']
?Jika Anda tahu data apa yang Anda inginkan, Anda harus memintanya secara eksplisit. IMO, GET, dan POST adalah dua hewan yang berbeda dan saya tidak dapat memikirkan alasan yang tepat mengapa Anda perlu mencampur data posting dan string kueri. Jika ada yang punya, saya akan tertarik.
Akan lebih mudah untuk menggunakan $ _REQUEST ketika skrip Anda mungkin merespons GET atau POST dengan cara yang sama. Saya berpendapat bahwa ini harus menjadi kasus yang sangat jarang, dan dalam kebanyakan kasus dua fungsi terpisah untuk menangani dua konsep terpisah, atau paling tidak memeriksa metode dan memilih variabel yang benar, lebih disukai. Alur program biasanya jauh lebih mudah diikuti jika tidak perlu melakukan referensi silang dari mana variabel mungkin berasal. Bersikaplah baik kepada orang yang harus menjaga kode Anda dalam waktu 6 bulan. Mungkin Anda.
Selain masalah keamanan dan WTF yang disebabkan oleh cookie dan variabel lingkungan dalam variabel REQUEST (jangan mulai saya di GLOBAL), pertimbangkan apa yang mungkin terjadi di masa mendatang jika PHP mulai mendukung metode lain seperti PUT dan DELETE. Meskipun sangat kecil kemungkinannya ini akan digabungkan ke dalam superglobal REQUEST, ada kemungkinan mereka dapat dimasukkan sebagai opsi dalam pengaturan variable_order. Jadi Anda benar-benar tidak tahu apa pun yang dimiliki REQUEST, dan apa yang diutamakan, terutama jika kode Anda diterapkan di server pihak ketiga.
Apakah POST lebih aman daripada GET? Tidak juga. Lebih baik menggunakan GET jika memungkinkan karena lebih mudah untuk melihat di log Anda bagaimana aplikasi Anda dieksploitasi ketika diserang. POST lebih baik untuk operasi yang memengaruhi status domain karena spider umumnya tidak mengikutinya, dan mekanisme pengambilan prediktif tidak akan menghapus semua konten Anda saat Anda masuk ke CMS. Namun, pertanyaannya bukanlah tentang manfaat GET vs POST, melainkan tentang bagaimana penerima seharusnya memperlakukan data yang masuk dan mengapa tidak baik untuk menggabungkannya, jadi ini benar-benar hanya BTW.
sumber
Saya rasa tidak ada masalah
$_REQUEST
, tapi kita harus berhati-hati saat menggunakannya karena ini adalah kumpulan variabel dari 3 sumber (GPC).Saya kira
$_REQUEST
masih tersedia untuk membuat program lama kompatibel dengan versi php baru, tetapi jika kita memulai proyek baru (termasuk perpustakaan baru) saya pikir kita tidak boleh menggunakan$_REQUEST
lagi untuk membuat program lebih jelas. Kami bahkan harus mempertimbangkan untuk menghapus penggunaan$_REQUEST
dan menggantinya dengan fungsi pembungkus untuk membuat program lebih ringan, terutama dalam memproses data teks besar yang dikirimkan, karena$_REQUEST
berisi salinan$_POST
.sumber
Wow ... baru saja beberapa skrip saya berhenti berfungsi karena peningkatan ke PHP 5.3 . Melakukan hal yang sama: asumsikan bahwa cookie akan disetel saat menggunakan
$_REQUEST
variabel. Dengan peningkatan yang tepat berhenti bekerja.Sekarang saya menyebut nilai cookie secara terpisah menggunakan
$_COOKIE["Cookie_name"]
...sumber
Masalah utamanya adalah itu berisi cookie, seperti yang dikatakan orang lain.
Di PHP 7 Anda dapat melakukan ini:
Ini menghindari masalah cookie dan paling buruk memberi Anda array kosong dan paling baik penggabungan $ _GET dan $ _POST dengan yang terakhir diutamakan. Jika Anda tidak terlalu repot dengan mengizinkan injeksi URL parameter melalui string kueri, itu cukup nyaman.
sumber
Sangat tidak aman. Juga canggung karena Anda tidak tahu apakah Anda mendapatkan POST atau GET, atau permintaan lain. Anda benar-benar harus mengetahui perbedaan di antara mereka saat mendesain aplikasi Anda. GET sangat tidak aman karena diteruskan di URL dan tidak cocok untuk hampir semua hal selain navigasi halaman. POST, meskipun tidak aman dengan sendirinya, memberikan satu tingkat keamanan.
sumber