Porting Register Globals

December 10, 2007
Rating : Not Rated


Bambang Nurcahyo Prastowo

Staf Pengajar pada Lab Elektronika dan Instrumentasi, Universitas Gadjah Mada

Artikel pendek ini saya tulis sehubungan dengan masih banyaknya pertanyaan tentang porting program-program PHP lama yang masih mengasumsikan register global on ke web hosting yang tidak memasang opsi register globalnya pada posisi off.

Pada awal perkembanganannya, sistem pemrograman PHP memberi kemudahan pada pengguna dengan memasukkan variabel semua parameter masukan dari web browser bagi dengan metoga GET, POST maupun COOKIE secara otimatis sehingga nama-nama variabel parameter tersebut langsung bisa dirujuk namanya pada skrip action. Karena PHP tidak membedakan sumber value variabel apakah dari GET, POST atau COOKIE, maka value untuk parameter dari COOKIE atau POST misalnya dapat disuntik dengan memanfaatkan pengetikan URL yang memuat pengisian nilai parameter GET. Apabila kita berhati-hati, otomatisasi pengisian variabel yang disebut register globals ini tidak selalu berakibat fatal namun secara umum dinilai membuka lubang keamanan cukup tinggi.

Pada sistem web server dengan fasilitas PHP yang baru, opsi register globals dimatikan by default. Banyak sistem-sistem program PHP lama menjadi tidak berfungsi karena pad umumnya mengandalkan register globals. Agar dapat berfungsi kembali, register globals dapat disimulasikan dengan menyisipkan
//script 1: simulasi register globals

foreach ($_GET as $key => $value) ${$key} = $value;
foreach ($_POST as $key => $value) ${$key} = $value;
foreach ($_COOKIE as $key => $value) ${$key} = $value;
//end script 1
di awal setiap program yang menerima parameter-parameter CGI tersebut. Perlu saya ingatkan kembali bahwa tindakan mematikan register globals dilakukan untuk menutup lubang keamanan yang mungkin ada pada program-program lama kita. Karena itu, membukanya kembali dengan skrip tersebut beresiko terbukanya kembali lubang keamanan yang diakibatkan oleh register globals tersebut.

Untuk memperbaiki program, kita harus menelusuri semua variabel cgi global yang digunakan dalam sistem program php kita yang perlu disisipkan di awal program dalam bentuk

$namavar = $_POST'namavar';
untuk setiap parameter COOKIE, POST dan GET. Untuk sistem yang panjang, penelusuran tersebut bisa makan waktu cukup lama untuk bisa mendapatkan semua variabel yang dibutuhkan. Untuk mempercepat pekerjaan migrasi register globals tersebut, silakan coba script berikut ini:

//script 2: menggali nama-nama variabel yang digunakan

function print_global($mtd, $key, $value){
print "$$key=$_$mtd"."'$key';n";
}


foreach ($_GET as $key => $value) print_global("GET",$key,$value);
foreach ($_POST as $key => $value) print_global("POST",$key,$value);
foreach ($_COOKIE as $key => $value) print_global("COOKIE",$key,$value);

//end penggalian nama variabel

Sisipkan di awal semua program action. Jalankan programnya dan copy tambahan teks program di bagian awal program tersebut untuk di pastekan sebagai bagian awal dari program-program action yang bersangkutan. Sebagai contoh, program tersebut saya sisipkan dibagian atas modul auth.php website ini dan kemudian saya coba isikan komentar artikel ini. Hasilnya pada bagian atas muncul tambahan teks:

Contoh hasil penggalian nama variabel:

$modul=$_GET'modul';
$dir=$_GET'dir';
$artikel=$_GET'artikel';
$posted=$_POST'posted';
$realname=$_POST'realname';
$message=$_POST'message';
$visrev=$_POST'visrev';
$keycode=$_POST'keycode';
$adminx=$_COOKIE'adminx';
Untuk selanjutnya pendefinisian variabel-variabel ini bisa ditempatkan dibagian atas auth.php tersebut untuk mendapatkan kembali nilai variabel yang dihilangkan oleh setting off dari register globals. Selamat mencoba.






Print Article Print Artikel
Send to a friend Kirim ke Teman
Save as PDF Save as PDF
Rate this Article :

1

2

3

4

5

6

7

8

9

10
Poor Excellent