Beranda > Pemrograman PHP > Pakai AppServ baik-baik saja, pakai XAMPP kok jadi ngga jalan ?

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.

Comments

comments

Kategori:Pemrograman PHP Tag
  1. aslimadiun
    21/06/2010 pada 22:41 | #1
    via Mozilla Firefox Mozilla Firefox 3.6.3 pada Windows Windows XP

    siip banget infonya pak… ditunggu yg lainnya….

  2. 22/06/2010 pada 11:44 | #2
    via Mozilla Firefox Mozilla Firefox 3.6.3 pada Windows Windows XP

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

  3. 22/06/2010 pada 12:25 | #3
    via Mozilla Firefox Mozilla Firefox 3.6.3 pada Windows Windows XP

    @Eyang di Bulan : Ya kamu itu Nis yang saya maksud “siswa yang menanyakan” 🙂

  4. saya
    22/06/2010 pada 15:05 | #4
    via Mozilla Firefox Mozilla Firefox 3.6.3 pada Ubuntu Linux Ubuntu Linux

    L.A.N.J.U.T.K.A.N……..

  5. 26/07/2010 pada 19:52 | #5
    via Mozilla Firefox Mozilla Firefox 3.6.6 pada Windows Windows XP

    ship brow lanjutkan aku juja siap untuk menyusul

  6. 09/08/2010 pada 23:58 | #6
    via Mozilla Firefox Mozilla Firefox 3.6.3 pada Ubuntu Linux Ubuntu Linux

    @mr dasyat
    Menyusul nang ndi Rek????jo nang nyusul ka”k clasMu seng nang Malang,nasibe MALANG……..
    hhehehehhe…….

  7. 23/09/2010 pada 11:15 | #7
    via Google Chrome Google Chrome 6.0.472.59 pada Windows Windows XP

    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

  8. 27/09/2010 pada 13:26 | #8
    via Mozilla Firefox Mozilla Firefox 3.6.10 pada Windows Windows XP

    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.

  9. pras
    11/07/2011 pada 17:14 | #9
    via Mozilla Firefox Mozilla Firefox 4.0.1 pada Windows Windows 7

    berati bagus pake apa atuh???? appserv atau xampp…

  10. 11/10/2011 pada 8:35 | #10
    via Google Chrome Google Chrome 3.0.195.1 pada Windows Windows 7

    thanks…baru mau menjajal…

  11. noval
    17/04/2012 pada 21:43 | #11
    via Opera Mini/Mobile Opera Mini/Mobile 6.5.27309 pada Series Series 60

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

  12. 22/04/2012 pada 9:51 | #12
    via Mozilla Firefox Mozilla Firefox 11.0 pada Windows Windows XP

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

  13. 22/02/2013 pada 18:36 | #13
    via Mozilla Firefox Mozilla Firefox 3.0.19 pada Windows Windows XP

    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!

  14. sadat
    18/12/2013 pada 2:07 | #14
    via Google Chrome Google Chrome 31.0.1650.63 pada Windows Windows 7

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

  15. 16/02/2014 pada 1:50 | #15
    via Mozilla Firefox Mozilla Firefox 26.0 pada Windows Windows 7

    terima kasih infonya, sangat bermanfaat

  16. nas
    23/02/2014 pada 12:36 | #16
    via Mozilla Firefox Mozilla Firefox 27.0 pada Windows Windows 7

    mantap

  17. kabi
    18/08/2014 pada 17:16 | #17
    via Google Chrome Google Chrome 36.0.1985.135 pada Android Android 4.1.2

    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

  18. 21/09/2014 pada 23:57 | #18
    via Mozilla Firefox Mozilla Firefox 32.0 pada Windows Windows 7

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

  1. Belum ada tautan balik

%d blogger menyukai ini: