Masih ingat dengan fitur User Code di PHPMaker? Sekedar mengingatkan kembali, bahwa fitur ini disediakan untuk memberi kesempatan kepada Web Developer mengubah kode PHP yang dihasilkan secara langsung oleh PHPMaker saat mode run-time. Artinya, kode PHP ini tidak bisa dilihat dalam file Template PHPMaker.
Hari ini saya menemukan ada sedikit kekurangan di dalam kode PHP yang dihasilkan melalui System Functions Security yang terdapat di salah satu file Template yang bernama phpcommon-scripts.php. Seperti yang kita ketahui, kode template berikut ini:
<!--##~SYSTEMFUNCTIONS.Security()##-->
akan menghasilkan sekumpulan kode PHP saat PHPMaker men-generate file script untuk Aplikasi Web Anda, sehingga hasil selengkapnya dari kode template di atas tadi menjadi seperti di bawah ini:
if (IsPasswordExpired()) $this->Page_Terminate(ew_GetUrl("changepwd.php")); if (!$Security->IsLoggedIn()) $Security->AutoLogin(); if (!$Security->IsLoggedIn()) { $Security->SaveLastUrl(); $this->Page_Terminate(ew_GetUrl("login.php")); } $Security->TablePermission_Loading(); $Security->LoadCurrentUserLevel($this->ProjectID . $this->TableName); $Security->TablePermission_Loaded(); if (!$Security->IsLoggedIn()) { $Security->SaveLastUrl(); $this->Page_Terminate(ew_GetUrl("login.php")); } if (!$Security->CanList()) { $Security->SaveLastUrl(); $this->setFailureMessage($Language->Phrase("NoPermission")); // Set no permission $this->Page_Terminate(ew_GetUrl("login.php")); } $Security->UserID_Loading(); if ($Security->IsLoggedIn()) $Security->LoadUserID(); $Security->UserID_Loaded();
Perhatikanlah kode tersebut di atas, khususnya yang di bagian ini:
if (!$Security->CanList()) { $Security->SaveLastUrl(); $this->setFailureMessage($Language->Phrase("NoPermission")); // Set no permission $this->Page_Terminate(ew_GetUrl("login.php")); }
Lantas, apakah kekurangan yang saya maksudkan itu? Begini. Dari potongan kode barusan, jika Pengguna sudah dalam posisi berhasil login lalu berusaha mengakses sebuah halaman yang tidak diijinkan oleh sistem, maka dia akan di-redirect ke halaman Login. Tentu saja hal ini sangat tidak baik. Mengapa?
Karena sebelumnya dia sudah dalam posisi login, maka seharusnya sitem tidak perlu lagi menampilkan halaman Login. Jika sistem tetap menampilkan halaman Login, maka hal ini menjadi sangat tidak masuk akal. Seharusnya, sistem memeriksa terlebih dulu apakah statusnya dalam posisi belum login, dan jika si Pengguna belum dalam posisi Login, maka barulah sistem menampilkan halaman Login.
Nah, pertanyaannya adalah, bagaimana cara kita untuk memodifikasi kode PHP yang dihasilkan saat mode run-time PHPMaker tersebut? Bukankah kode PHP tersebut tidak bisa kita ubah dari file Template?
Jangan khawatir! PHPMaker sudah mengantisipasi hal ini. Anda sebagai Web Developer dapat mengatasinya dengan sangat mudah. Cukup dengan memasukkan kode berikut ke dalam file usercode.js yang terdapat di dalam sub-folder src di bawah folder installasi tujuan PHPMaker di komputer Anda:
SYSTEMFUNCTIONS.Security.replace('$this->setFailureMessage($Language->Phrase("NoPermission")); // Set no permission\r\n $this->Page_Terminate(ew_GetUrl("login.php"));', '$this->setFailureMessage($Language->Phrase("NoPermission")); // Set no permission\n if (!$Security->IsLoggedIn()) $this->Page_Terminate(ew_GetUrl("login.php"));');
Perhatikanlah kode tersebut. Fungsi dari kode ini adalah untuk menimpa semua kode PHP yang dihasilkan oleh System Functions Security tersebut menjadi kode PHP di atas ini.
Karena kode tersebut dilewatkan melalui sebuah file .js, maka kita harus mengikuti kaidah penulisan kode Javascript. Di antaranya: untuk pindah baris, maka kita harus menggunakan karakter \r\n untuk acuan kode yang akan ditimpa, dan semuanya harus di dalam satu baris.
Perhatikan juga bahwa semua kode di atas akan diapit dengan tanda petik tunggal, karena di dalam kode PHP itu sendiri mengandung karakter petik ganda.
Sekarang pastikan Anda sudah menyimpan perubahan tadi di file usercode.js tersebut. Selanjutnya, jangan lupa untuk men-generate ulang semua file script dengan menggunakan PHPMaker seperti biasa. Setelah proses generate selesai, silahkan cek kode di dalam file *list.php yang sudah di-generate oleh PHPMaker, khususnya di dalam function Page_Init. Seharusnya sekarang Anda akan melihat kode selengkapnya seperti di bawah ini:
$Security = new cAdvancedSecurity(); if (IsPasswordExpired()) $this->Page_Terminate(ew_GetUrl("changepwd.php")); if (!$Security->IsLoggedIn()) $Security->AutoLogin(); if (!$Security->IsLoggedIn()) { $Security->SaveLastUrl(); $this->Page_Terminate(ew_GetUrl("login.php")); } $Security->TablePermission_Loading(); $Security->LoadCurrentUserLevel($this->ProjectID . $this->TableName); $Security->TablePermission_Loaded(); if (!$Security->IsLoggedIn()) { $Security->SaveLastUrl(); $this->Page_Terminate(ew_GetUrl("login.php")); } if (!$Security->CanList()) { $Security->SaveLastUrl(); $this->setFailureMessage($Language->Phrase("NoPermission")); // Set no permission if (!$Security->IsLoggedIn()) $this->Page_Terminate(ew_GetUrl("login.php")); } $Security->UserID_Loading(); if ($Security->IsLoggedIn()) $Security->LoadUserID(); $Security->UserID_Loaded();
Jadi, kode yang berubah ada di bagian ini:
if (!$Security->CanList()) { $Security->SaveLastUrl(); $this->setFailureMessage($Language->Phrase("NoPermission")); // Set no permission if (!$Security->IsLoggedIn()) $this->Page_Terminate(ew_GetUrl("login.php")); }
Wow, betapa mudah dan cepatnya, bukan? PHPMaker memang keren! 😀
Tinggalkan Balasan