Pakai AppServ baik-baik saja, pakai XAMPP kok jadi ngga jalan ?
Beberapa waktu yang lalu, dalam waktu yang hampir bersamaan, ada beberapa rekan yang menanyakan satu permasalahan “sederhana yang tidak sepele”. Umumnya menanyakan, “kenapa ya kok coding yang saya buat pakai PHP bisa jalan lancar sewaktu pakai AppServ, tapi kok ga bisa jalan sewaktu saya pindah ke XAMPP ?”. Yang bertanya mulai dari siswa, rekan sejawat, hingga rekan sesama guru RPL dari SMK luar kota.
Sebenarnya, di antara kedua web-server package tersebut (AppServ dan XAMPP, setidaknya untuk versi yang digunakan saat kasus ini terjadi) bisa dibilang tidak ada yang salah. Akan lebih brutal lagi kalau langsung men-judgement bahwa AppServ lebih baik dari XAMPP, atau XAMPP lebih ruwet dibanding AppServ, dsb. Permasalahan yang ada sebenarnya hanya terletak pada satu baris setting saja di file php.ini milik masing-masing paket. Satu baris ???!!! Ya, satu baris saja. Pada php.ini terdapat setting register_globals yang bisa berisi value On atau Off. Faktanya, pada AppServ hingga versi 2.5.10, register_globals bernilai On, dan pada XAMPP (mungkin sejak versi awal, hingga versi 1.7.1) register_globals selalu diset ke Off.
register_globals menentukan apakah PHP me-register variabel dalam kelompok EGPCS (Environment, GET, POST, Cookie, Server) sebagai variabel global atau tidak. Artinya, jika register_globals bernilai On, variabel dalam kelompok EGPCS tersebut akan dapat langsung diakses dengan cara memanggil nama variabelnya secara langsung, terlepas dari sumber variabel tersebut, apakah dari form HTML dengan method POST, GET, ataukah dari URL, atau bahkan dari Session. Pada kondisi ini, jika kita ingin membaca variabel dari form submission yang menggunakan method POST maka kita masih bisa secara langsung memanggilnya dengan (misal) :
if (isset($username) && (trim($username) != "")) {
Kode tersebut menunjukkan satu celah keamanan yang cukup signifikan, karena kode program tidak secara tegas memaksudkan variabel yang akan diproses adalah variabel “username” yang berasal dari pengiriman form dengan method POST, sehingga bisa dengan mudah di-override dengan mengirimkan sesuatu via URL, misal proses_login.php?username=blablabla karena variabel yang berasal dari POST, GET, maupun ENV akan dianggap sama saja. Parahnya lagi, banyak sekali tutorial-tutorial PHP yang beredar menggunakan teknik ini, dengan mengasumsikan bahwa register_globals dalam setting On.
Tentu saja, jika kode program semacam itu dijalankan pada XAMPP, yang secara konsisten menggunakan setting Off pada register_globals, variabel yang digunakan tidak akan dikenali, atau dianggap tidak ada. Hasil dari jalannya program pun tidak seperti yang diharapkan. Lantas bagaimana cara mengatasinya ? Satu-satunya cara yang penulis sarankan adalah untuk tertib dalam menuliskan kode program, dan memanfaatkan superglobals. Superglobals adalah variabel built-in pada PHP yang selalu tersedia pada semua scope/jangkauan, tanpa perlu dideklarasikan, dan lebih penting lagi, tanpa tergantung dengan setting apakah register_globals bernilai On atau Off. Dengan teknik ini, kode yang kita buat akan lebih adaptif dengan setting server, entah pakai register_globals diset ke On maupun Off. Superglobals, yang diperkenalkan mulai PHP versi 4.1.0 (wah, sudah lama banget) terdiri atas variabel array berikut :
Cara pemakaiannya relatif mudah, namun yang biasanya cukup sulit adalah mengubah kebiasaan. Jika Anda terbiasa mengecek session “username” untuk mengecek user yang bersangkutan sudah login atau belum menggunakan
if (isset($username)) { echo "Selamat datang, " . $username; }
mulai sekarang gunakanlah superglobals $_SESSION jika Anda memang benar-benar bermaksud mengecek variabel session, sehingga kode di atas bisa diubah menjadi :
if (isset($_SESSION[username])) { echo "Selamat datang, " . $_SESSION[username]; }
Karena jika tidak, pada kasus contoh pertama (tidak menggunakan superglobals) Anda akan mudah “ditipu” oleh pengakses yang tidak punya account atau bahkan tidak login, hanya melalui variabel di URL saja. Begitu juga untuk variabel yang lain, Anda bisa membuat analogi sendiri untuk pemanfaatannya. Setelah membaca artikel ini, sebaiknya Anda mulai bereksperimen dengan berbagai kondisi dan contoh kasus, mengenai efek dari digunakannya nilai yang berbeda pada setting register_globals.
Update:
Sejak PHP versi 5.3.0 (yang juga menjadi paket pada XAMPP mulai versi 1.7.2), setting register_globals dianggap “deprecated”, alias dihilangkan dari fitur PHP. Sebelumnya, sejak PHP versi 4.2.0, setting default untuk register_globals adalah selalu Off. Entah apa pertimbangan dari pengemas AppServ yang memutuskan untuk membuatnya menjadi On secara default.
Semoga mencerahkan dan menjadi ilmu yang bermanfaat. Kritik dan saran ditunggu pada bagian komentar.
siip banget infonya pak… ditunggu yg lainnya….
Sip Pak…..lanjutkan info-infonya lagi,,,klo tdk salah ini dlu saya sdh pernah tanyakn ke Pak Hendri langsung,,klo bca artikelnya jadi lebih mngerti Pak…..
@Eyang di Bulan : Ya kamu itu Nis yang saya maksud “siswa yang menanyakan” 🙂
L.A.N.J.U.T.K.A.N……..
ship brow lanjutkan aku juja siap untuk menyusul
@mr dasyat
Menyusul nang ndi Rek????jo nang nyusul ka”k clasMu seng nang Malang,nasibe MALANG……..
hhehehehhe…….
salam dasyat……!!!
pak hendri,, saya mau tanya kalau setelah membikin website secara local, terus mau di Online kan itu bagai mana?? dan hosting yang murah atau gratis itu dimana??
trimakasih..:D:D:D
Jika memang untuk keperluan profesional/komersial, bisa dengan menyewa layanan web hosting, misalnya di http://www.techscape.co.id atau http://www.indoglobal.com atau http://www.rumahweb.com .
Namun untuk belajar, kita juga bisa mendaftarkan layanan gratis di http://www.000webhost.com misalnya, tentunya dengan beberapa batasan dan perbedaan fasilitas.
berati bagus pake apa atuh???? appserv atau xampp…
thanks…baru mau menjajal…
pak saya sudah terbiasa pakai appserve seperti bapak bilang stelah saya berganti haluan k xampp bingung..bgmn cara mengubah register global di xampp 1.7..? trimakasih pak..
Saya rasa sudah dijelaskan dengan cukup gamblang pada artikel di atas, yang pada intinya kita tidak sebaiknya menyalakan register_globals di php.ini bawaan XAMPP hanya karena ingin coding yang telah kita buat (dan jalankan) di AppServ langsung bisa dijalankan di XAMPP.
Inti dari pembahasan di atas adalah bagaimana membiasakan coding di PHP dengan standar lebih tinggi agar tercipta aplikasi web yang lebih aman, tahan terhadap serangan, dan mampu dijalankan pada kondisi platform dengan setting register_globals baik pada setting On maupun Off, dalam hal ini dengan memanfaatkan Superglobals (yang sudah saya jelaskan juga di sana).
Its Kesenangan untuk memahami blog Anda. Artikel di atas cukup luar biasa, dan aku benar-benar menikmati membaca blog Anda dan poin yang Anda dinyatakan. Saya sangat suka muncul kembali secara khas, posting banyak lainnya yang berjarak topik. Terima kasih untuk berbagi … terus menulis!
permisi mas saya mau tanya. saya membuat web dengan dreamweaver. saya sedang mencoba membuat drop menu. lalu saya coba jalankan d localhost. tp pilihan drop menu yg turunnya itu tidak bisa muncul. sedangkan kalau saya coba upload k hosting bisa. mohon bantuannya….
terima kasih infonya, sangat bermanfaat
mantap
Maaf pak,mau tanya.
Saya sudah pakai superglobal seperti itu, tapi tetap saja ndak bisa. Disini saya aplikasikan degn tujuan php akan menampilkan jumlah halaman web yg sudah dibuka sebelumnya pada halaman yg dibuka sekarang (lewat server xampp), saya pakai superglobal, tp tetep ndak bkerja. Yg ditampilkan selalu angka satu(artiny ini pertamakalinya membuka halaman) padahal sudah berkali2 membuka halaman. Kemungkinannya salahnya dimana pak..? Tlong jawabannya
@kabi :
maaf baru dibalas.., pertanyaanmu baru kebaca. Jika yang dibutuhkan konteksnya seperti di tujuan pengaplikasikan yang kamu sebutkan di atas, maka superglobal yang dipakai di sini seharusnya $_SESSION, misal dinamai $_SESSION[“hlm_dibuka”]. Namun syaratnya setiap halaman web yang memanfaatkan variabel $_SESSION harus diawali dengan session_start() selum mengoutputkan apapun ke halaman web, bahkan tidak boleh didahului dengan satu spasi pun.