Disable Functions
Ada beberapa fungsi di
PHP sangat berbahaya apabila digunakan tidak hati-hati. Sebagai salah satu
contohnya adalah fungsi system() yang dapat digunakan untuk mengeksekusi shell
command dari kode PHP anda. Kemudian ada juga fungsi ini_set() yang dapat
mengubah konfigurasi php ini melalui kode PHP yang ada. Fungsi-fungsi seperti
ini akan lebih baik jika dinon-aktifkan saja apabila memang tidak ada aplikasi
web anda yang menggunakannya. Untuk itulah ada option disable_functions di php ini.
Option ini akan men-disable semua fungsi yang disebutkan di dalamnya. Sehingga
jika ada kode PHP yang menggunakan fungsi tersebut, kode tersebut tidak akan
berjalan.
Contoh isi
disable_functions yang disarankan (setiap nama fungsi dipisahkan dengan tanda
koma), dapat ditambahi, dapat juga dikurangi sesuai dengan kebutuhan.
Sebetulnya ada 2 fungsi
lagi yang bisa di-disable, yaitu base64_decode dan mysql_pconnect. Untuk
mysql_pconnect ini masih tidak terlalu berbahaya jika digunakan. Hanya saja
jika digunakan secara sembarangan dapat menghabiskan resource server yang cukup
besar untuk menyimpan persistent connection.
Sedangkan
base64_decode, biasanya digunakan untuk menyembunyikan kode-kode PHP yang
berbahaya dalam bentuk base64, sehingga tidak dapat terdeteksi oleh antivirus
atau secara manual. Biasanya fungsi ini akan dipanggil di dalam fungsi eval().
Meskipun begitu, beberapa CMS (moodle), PHP Framework (CodeIgniter), dan
PHPMyAdmin menggunakan fungsi ini juga. Jadi jika di-disable, kemungkinan
besar, fungsionalitas dari aplikasi-aplikasi tersebut akan terganggu. Karena
itu, di bawah ini akan dijelaskan bagaimana agar script-script berbahaya yang
bersembunyi dengan base64_decode dapat dicegah.
Disable Eval() Function
Eval adalah sebuah
fungsi yang dapat digunakan untuk menjalankan script PHP yang ada di dalam
parameter fungsi eval tersebut. Hal ini sangat berbahaya, karena bisa saja
fungsi yang dijalankan di dalam eval() adalah fungsi-fungsi untuk meretas
sistem kita. Karena itu, fungsi eval ini harus di-disable atau minimal dibatasi
kemampuannya.
Option
disable_functions tidak dapat mencegah fungsi eval() untuk berjalan, cara lain
untuk men-disable eval() adalah dengan menggunakan patch suhosin untuk php.
Kelebihan patch ini adalah tidak perlu mengompile ulang php untuk menjalankannya.
Di beberapa distro seperti ubuntu, debian, dan fedora, patch ini sudah ada di
repository. Jadi kita tinggal install saja di server dengan menggunakan apt-get
atau synaptic atau yum. Paketnya biasanya bernama php5-suhosin. Setelah paket
ini terinstall, buka file /etc/php5/apache2/conf.d/suhosin.ini (mungkin berbeda
untuk distro selain Ubuntu dan Debian).
Kemudian pastikan baris
ini aktif (tidak dianggap sebagai komentar) di file tersebut :
extension=suhosin.so
Setelah itu cari 3
baris ini :
suhosin.executor.eval.whitelist =
suhosin.executor.eval.blacklist =
suhosin.executor.disable_eval = off
Baris whitelist
digunakan untuk menentukan fungsi-fungsi apa saja yang boleh dieksekusi oleh
fungsi eval. Sedangkan blacklist menentukan fungsi-fungsi apa saja yang tidak
boleh dijalankan oleh fungsi eval. Apabila kita ingin men-disable eval secara
keseluruhan, maka kita harus merubah parameter suhosin.executor.disable_eval
menjadi on. Akan tetapi beberapa CMS juga ada yang memanfaatkan fungsi eval
ini. Karena itu, kita bisa memanfaatkan blacklist saja untuk mencegah beberapa
fungsi berjalan di dalam eval. Isi dari blacklist dapat diisi sama dengan
disable_functions tadi, atau cukup ditambahkan fungsi-fungsi tertentu yang
tidak boleh berjalan di dalam eval, seperti base64_decode.
Di bagian sebelumnya
base64_decode tidak dimasukkan ke disable_function, karena masih banyak yang
menggunakannya. Tetapi aplikasi web biasa, jarang menggunakan base64_decode di
dalam eval. Biasanya yang seperti itu hanya para pembuat theme CMS yang ingin
menyembunyikan kode untuk menampilkan copyrightnya. Oleh karena itu, base64_decode
ini didaftarkan saja di blacklist suhosin agar dia tidak berjalan apabila
berada di dalam fungsi eval.