Saya telah melihat orang (yang umumnya menulis kode yang baik) langsung mengubah $_POST
array dengan kode seperti ini:
// Add some value that wasn't actually posted
$_POST['last_activity'] = time();
// Alter an existing post value
$_POST['name'] = trim($_POST['name']);
// Our pretend function
// Pass the entire $_POST array as data to work with in the function
// The function update_record() will read only the values we actually need
update_record($_POST);
// ...That sure was easier than creating a new array
// with only the $_POST values we actually need.
Masuk akal bahwa update_record()
seharusnya tidak mengakses $ _POST secara langsung, jadi kita dapat mengirimkan array data lain misalnya, tetapi tentu ini malas, desain yang buruk, atau mungkin hanya salah? Namun, kami masih meneruskan array yang valid update_record()
, jadi mengapa membuat yang baru?
Ini bukan inti dari pertanyaan, hanya sebuah contoh penggunaan. Namun, saya telah mendengar banyak orang mengatakan bahwa ini tidak boleh dilakukan dengan $_REQUEST
data, dan itu praktik yang buruk. Tapi kenapa? Terlihat tidak berbahaya.
Contoh:
Menetapkan nilai default
$_GET
(atau posting) yang tidak benar-benar adaMenambahkan
$_POST
nilai yang tidak benar-benar diposting setelah pengiriman formulirSanitasi langsung atau memfilter nilai
$_GET
array atau kunci sangat awal dalam skrip (sanitasi fallback ... mengapa tidak?)Menetapkan
$_POST
nilai secara manual sebelum pengiriman formulir untuk mengisi input dengan nilai default (ketika input membaca$_POST
untuk nilai standarnya; Saya telah melakukan ini)Membuat
$_SERVER
nilai - nilai Anda sendiri ? Tentu, hei kenapa tidak?Bagaimana dengan yang lain, suka
$_COOKIE
dan tidak$_SESSION
? Tentu saja kita harus memodifikasinya secara langsung bukan? Lalu mengapa tidak yang lain?
Haruskah modifikasi superglobals langsung tidak pernah dilakukan, atau apakah boleh dilakukan dalam beberapa kasus?
Jawaban:
Mengingat PHP sudah mengatur superglobals itu, saya tidak berpikir itu jahat untuk memodifikasinya. Dalam beberapa kasus, ini mungkin cara terbaik untuk menyelesaikan masalah ... terutama ketika berhadapan dengan kode pihak ketiga yang tidak mudah Anda modifikasi. (Mereka mungkin menggunakan
$_GET
secara langsung atau menganggap beberapa kunci ada$_SERVER
, dll.)Namun, secara umum, saya pikir ini adalah praktik yang buruk ketika Anda menulis kode Anda sendiri. Memodifikasi
$_REQUEST
data dengan beberapa filter di balik layar yang berjalan pada setiap halaman secara otomatis cenderung menimbulkan efek samping. (Lihat semua masalah yang disebabkan "kutipan sihir" sebagai bukti.)Jadi, jika Anda tidak akan melakukan itu (secara otomatis menyaring superglobals), maka yang berikut ini tidak memberi Anda manfaat:
ketika Anda dapat dengan mudah melakukannya:
Saya pikir itu jauh lebih jelas untuk membuat perbedaan situs-lebar yang
$_POST
dan$_GET
yang selalu tanpa filter, data yang tidak dipercaya, dan mereka harus tidak pernah digunakan sebagai-adalah.Dengan menyalin nilai yang difilter ke variabel lain, Anda membuat klaim bahwa, "Saya mengerti apa yang saya lakukan ... Saya telah memfilter input ini, dan aman untuk digunakan."
sumber
$_POST
, membersihkannya seiring berjalannya waktu. Dan mengenai orang lain yang melakukan ini ... yah, banyak orang menulis kode PHP yang sangat buruk, tapi itu bukan alasan untuk Anda juga. :)Saya biasanya menyarankan agar Anda tidak mengubah super-global yang telah ditentukan sebelumnya sehingga jelas apa data yang disanitasi dan data mentah / tidak dipercaya.
Orang lain mungkin menyarankan bahwa jika Anda membersihkan superglobals pada awal siklus permintaan maka Anda tidak perlu khawatir tentang mereka di tempat lain.
Saya selalu mencocokkannya saat Anda membutuhkannya:
atau serupa.
Dalam hal variabel lain itu praktek yang baik untuk tidak menulis ke salah
$_GET
,$_POST
,$_REQUEST
,$_SERVER
atau$_COOKIE
.$_SESSION
Namun berbeda karena Anda sering ingin menulis data ke sesi yang kemudian bertahan di berbagai permintaan dalam sesi.sumber
setcookie
ada, tetapi kami mendapat cookie melalui$_COOKIE
? Juga, karena$_COOKIE
hanya diatur ketika sesi saat ini dimulai, dan tidak pernah diperbarui, itu mengharuskan Anda mengubah / mengatur cookie di kedua area sehingga area kode selanjutnya memiliki informasi terkini.Anda harus menghindarinya. Mungkin suatu saat Anda lupa membersihkan sesuatu, maka Anda dapat mengambil data berbahaya. Jika Anda menyalin data ke struktur baru saat membersihkan
$_POST
dalamnya jugaSkrip lain tambahan mungkin berasumsi, bahwa array tidak tersentuh dan mungkin bereaksi penasaran.
sumber
Saya tidak pernah menyukai gagasan memodifikasi superglobal karena itu menyesatkan. Ini adalah cara cepat untuk melakukan sesuatu yang hampir pasti ada cara yang lebih baik untuk dilakukan.
Jika Anda mengubah nilai
$_POST
, misalnya, maka Anda mengatakan bahwa perangkat lunak menerima data yang tidak.MASALAH NYATA
Ada situasi kehidupan nyata di mana ini menjadi masalah besar:
Bayangkan Anda bekerja dalam sebuah tim. Di dunia yang ideal, semua orang menggunakan sintaksis yang sama, tetapi kita tidak hidup di dunia yang ideal. Salah satu pengembang, John, suka mengakses data yang diposting menggunakan
$_POST
. Dia mengubah sesuatu di post vars:Kemudian Anda memiliki pengembang lain, Chris, yang lebih suka menggunakan
filter_input
untuk mengakses data yang dimasukkan (yaitu GET, POST, SERVER, COOKIE) untuk melindungi perangkat lunak saat memproses data yang dapat diubah oleh pengguna. Di bagian perangkat lunaknya, ia perlu mendapatkan nilai postingranking
. Bagiannya dari kode adalah SETELAH milik John.Dari contoh di atas, dengan mengubah superglobal, Anda telah merusak PHP. John telah menetapkan nilai
$_POST['ranking']
ke 2 untuk alasan apa pun, tetapi sekarang Chris telah menerima nilai 1Ketika saya tidak melihat cara lain untuk melakukannya:
Saya bekerja pada sebuah proyek yang menggunakan wordpress sebagai blognya di belakang load-balancer AWS. Ini mengubah nilai
$_SERVER['remote_address']
. Dalam hal ini, pengembang lain tidak punya pilihan selain melakukan hal berikut:Kesimpulan
Hampir pasti ada cara yang lebih baik daripada mengganti superglobals
sumber
Saya pikir pertanyaan sebenarnya di sini adalah "mengapa Anda harus memodifikasi tema?". Saya tidak melihat alasan yang sah untuk melakukannya. Jika Anda perlu membersihkan imput, Anda mungkin ingin menggunakan variabel lokal ...
Kecuali jika kode Anda cukup pendek (katakanlah, panjangnya kurang dari 50 baris), memodifikasi yang super global hanya akan membuat kode Anda lebih sulit untuk dipelihara dan undersand.
Omong-omong, Anda tidak perlu meneruskan $ _POST ke fungsi, karena ini adalah array superglobal yang dapat diakses bahkan dalam lingkup fungsi lokal.
sumber
$_POST
data? Melewati$_POST
membuat fungsi membersihkan data apa pun .Setelah awalnya menjawab pertanyaan ini dengan mengatakan seharusnya tidak ada alasan untuk memodifikasi superglobals, saya mengedit jawaban ini dengan contoh saat saya memutuskan untuk melakukannya.
Saat ini saya sedang mengerjakan tabel database penulisan ulang URL di mana
request
kolom mengarahkan pengguna ketarget
kolom yang sesuai .Misalnya,
request
mungkinblog/title-here
dantarget
mungkinblog.php?id=1
.Karena
blog.php
mengharapkan$_GET
variabel, dan saya tidak ingin mengubahheader("Location:")
, saya melakukan sesuatu seperti ini:Ini menciptakan
$_GET
larik yang berisi parameter yang dimaksudkan dilewatkan olehtarget
kolom.Pada akhirnya, saya akan sangat menyarankan untuk memodifikasi superglobals kecuali Anda benar-benar harus melakukannya .
sumber