Anda boleh saja tetap menggunakan register global apabila ingin mengembangkan aplikasi berbasis web dengan PHP. Akan tetapi bersiap-siaplah untuk kecewa, karena pada PHP versi 6 fungsi register global ini sudah dihilangkan.
Dengan kata lain mau nggak mau mulai sekarang Anda harus membiasakan diri untuk tidak menggunakan register global. Mungkin Anda bertanya, kenapa register global dihilangkan?
Sebenarnya kalau kita hati-hati dalam menggunakan register global, aplikasi web yang kita kembangkan pun bisa saja tetap secure. Hanya saja sebagian besar web programmer kurang memperhatikan aspek keamanan dalam aplikasi yang ia kembangkan.
Contohnya adalah skrip yang kita bahas pada tulisan bagian 1. Kalau kita cermati dengan teliti, sebenarnya skrip program tersebut memiliki celah keamanan yang cukup fatal (dengan asumsi register_global diset ON).
Anda tahu dimana letak kesalahannya? Mari kita bahas sama-sama.
Seperti yang pernah saya bahas sebelumnya, dengan meng-ON-kan fungsi register_global maka semua variabel EGPCS akan menjadi variabel global. Kita bisa mengambil isinya secara langsung tanpa harus menggunakan array $_REQUEST, $_GET dan sebagainya.
Kita mengasumsikan bahwa register global diset ON. Sekarang coba Anda akses program tersebut melalui browser dengan tambahan parameter is_login=true di bagian belakangnya.
Misalnya:http://localhost/index.php?is_login=true
Anda lihat, apa yang terjadi? Ternyata form loginnya menjadi tidak berguna sama sekali. Kita bisa mengakses halaman yang seharusnya baru bisa dilihat setelah login. Kenapa bisa demikian?
Letak kesalahannya ada di bagian if (!$is_login). Anda harus ingat, bahwa apabila register global diset ON, semua variabel EGPCS akan dianggap variabel global. Begitu juga dengan variabel yang di-inject melalui URL (dalam hal ini variabel $is_login).
Dengan demikian blok yang berisi form login akan dilewatkan begitu saja. Lalu bagaimana cara untuk mengatasi hal tersebut? Akan lebih baik jika program tersebut diubah menjadi seperti ini.
<?php $is_login = false; $userlogin = $_REQUEST['userlogin']; $password = $_REQUEST['password']; if ($userlogin == 'admin' and $password == '123456') $is_login = true;?> <?php if (!$is_login) : ?> <h1>Silakan Anda login dulu</h1> <form action="<?=$_SERVER['PHP_SELF'] ?>" method="POST"> <p>User Login: <input type="text" name="userlogin" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form> <?php else : ?> <?php // isi halaman yang bisa diakses setelah login ?> <p>Ini data rahasia</p> <?php endif; ?>
Dengan cara seperti ini, apabila ada yang meng-inject URL dengan parameter is_login=true maka variabel $is_login akan di-overwrite oleh $is_login = false. Lebih aman dibandingkan dengan skrip yang pertama.
Hampir semua celah keamanan pada PHP berawal dari hal-hal sepele seperti contoh di atas. Oleh karena itu kita harus ekstra hati-hati dalam membuat aplikasi dengan PHP.





Nanang Ars | December 17th, 2008 jam 9:30 pm
Seep, trims tambahan ilmunya..
Yang kayak gini perlu masuk di bookmark nih !!