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
$ _REQUEST adalah salah satu kelemahan desain terbesar di PHP. Setiap aplikasi yang menggunakan $ _REQUEST kemungkinan besar rentan terhadap masalah Pemalsuan Permintaan Lintas Situs Tertunda. (Ini pada dasarnya berarti jika misalnya cookie bernama (usia) ada, itu akan selalu menimpa konten GET / POST dan oleh karena itu permintaan yang tidak diinginkan akan dilakukan)
dan di balasan nanti ke utas yang sama
Ini bukan tentang fakta bahwa seseorang dapat memalsukan GET, POST; Variabel COOKIE. Ini tentang fakta bahwa COOKIE akan menimpa data GET dan POST di REQUEST.
Oleh karena itu saya dapat menginfeksi browser Anda dengan cookie yang mengatakan misalnya action = logout dan sejak hari itu Anda tidak dapat menggunakan aplikasi lagi karena REQUEST [action] akan keluar selamanya (sampai Anda menghapus cookie secara manual).
Dan untuk menginfeksi Anda dengan COOKIE sangatlah sederhana ...
a) Saya dapat menggunakan XSS vuln di aplikasi apa pun di subdomain
b) Pernah mencoba menyetel cookie untuk * .co.uk atau * .co.kr ketika Anda memiliki a domain tunggal di sana?
c) Lintas domain lainnya dengan cara apa pun ...
Dan jika Anda yakin bahwa ini bukan masalah, saya dapat memberi tahu Anda bahwa ada kemungkinan sederhana untuk menyetel cookie fea * .co.kr yang mengakibatkan beberapa versi PHP hanya menampilkan halaman putih. Bayangkan: Hanya satu cookie untuk mematikan semua halaman PHP di * .co.kr
Dan dengan menetapkan ID sesi ilegal dalam cookie yang valid untuk * .co.kr dalam variabel bernama + PHPSESSID = ilegal Anda masih dapat melakukan DOS setiap aplikasi PHP di korea menggunakan sesi PHP ...
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:
variable_order Menyetel urutan penguraian variabel EGPCS (Environment, Get, Post, Cookie, dan Server). Misalnya, jika variable_order diset ke "SP" maka PHP akan membuat superglobals $ _SERVER dan $ _POST, tetapi tidak membuat $ _ENV, $ _GET, dan $ _COOKIE. Menyetel ke "" berarti tidak ada superglobals yang akan disetel.
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
Semakin banyak hal seperti ini yang kami hapus, semakin sulit bagi orang untuk segera beralih ke versi PHP yang lebih baru, lebih cepat, dan lebih aman. Hal itu menyebabkan lebih banyak frustrasi bagi semua orang daripada beberapa fitur warisan yang "jelek". Jika ada alasan teknis, kinerja, atau keamanan yang layak, maka kita perlu melihatnya dengan saksama. Dalam hal ini, hal yang harus kita perhatikan bukanlah apakah kita harus menghapus $ _REQUEST tetapi apakah kita harus menghapus data cookie darinya. Banyak konfigurasi telah melakukannya, termasuk semua milik saya, dan ada alasan keamanan valid yang kuat untuk tidak menyertakan cookie di $ _REQUEST. Kebanyakan orang menggunakan $ _REQUEST yang berarti GET atau POST, tidak menyadari bahwa itu juga bisa berisi cookie dan karena itu orang jahat berpotensi melakukan beberapa trik injeksi cookie dan merusak aplikasi yang naif.
Bagaimanapun, harapan itu memberi sedikit cahaya.