Tips Keamanan Website

pic Tips Keamanan Website

Banyak yang berkata “jangan pernah percaya kepada input dari pengguna” atau “don’t ever trust user input”, khususnya dalam dunia web programming dan developing. Kalimat itu tentu bukan sekedar kalimat biasa yang tidak ada artinya atau sekedar menjadi kata-kata mutiara tanpa penerapan. Dunia internet merupakan dunia yang sangat terbuka di mana setiap orang, mulai dari yang baik sampai yang memiliki rencana jahat bisa mengakses dunia yang kita buat di internet.

Walaupun ada banyak penyebab security di PHP dibobol oleh orang lain, akan tetapi penyebab yang paling utama dan sering terjadi adalah melalui user input. Padahal di sisi lain, user input dapat digolongkan sebagai tonggak suatu website dinamis. User input ini sendiri dapat berupa paramater dalam URL, form kiriman dari user, maupun alamat dari URL.

Jadi bagaimana kita harus menghadapi bahaya yang mungkin terjadi karena masalah user input? Jawabannya adalah dengan validasi dan pembersihan / sanitize terhadap input yang dikirimkan oleh user. Berikut ini hal-hal yang penting dalam melakukan validasi dan sanitizing terhadap user input.


Melakukan escaping terhadap input. Escaping dilakukan agar parser atau compiler dapat membedakan user input dengan kode yang digunakan oleh developer. Umumnya beberapa karakter yang harus di-escape adalah ” (tanda kutip dua), ‘ (tanda kutip satu), \ (garis miring terbalik), dan karakter ASCII khusus seperti NULL dan sebagainya. Kegagalan dalam melakukan escaping dapat menyebabkan banyak code injection seperti SQL injection, XSS dan sebagainya. Dalam PHP sendiri disediakan beberapa function untuk melakukan escaping seperti addslashes() atau mysql_real_escape_string().

Tetapi developer harus berhati-hati melakukan escaping bila setting magic_quote_gpc pada php.ini diaktifkan karena bisa terjadi dua kali escaping yang ditandai dengan kemunculan tanda \ (backslash) sebelum beberapa karakter yang dituliskan di atas misalnya \” atau \’ .

Melakukan type casting. Seperti yang diketahui bahwa PHP memiliki cara penulisan weak typing dan type jugling yang artinya tipe data dalam kode PHP dapat dicampuradukkan dan dibandingkan dengan tipe data yang tidak sejenis. Misalnya saja string “5” akan sama dengan integer 5 bila menggunakan operator perbandingan yang biasa yaitu ==.

Casting dilakukan untuk mengubah suatu tipe data, misalnya dari string “5” menjadi integer 5. Type casting akan berfungsi dengan baik bila digunakan untuk casting ke integer, bool dan float dalam PHP mengingat casting ke string akan dilakukan otomatis sesuai dengan tempat di mana data tersebut digunakan dan juga karena user input otomatis dianggap sebagai string. Bila memungkinkan, lakukan type casting sebelum menggunakannya dalam tempat-tempat yang mungkin diinjeksi seperti query SQL atau dynamic evaluation menggunakan eval(). Untuk melakukan type cast sendiri bisa dilakukan beberapa cara seperti menggunakan intval() atau floatval(), atau cukup menambahkan nama tipe data dalam kurung sebelum variabel yang digunakan. Misalnya: $a = (int) $varstr;

Menggunakan nilai default. Seringkali sebuah halaman tidak selalu harus diinput, baik dari parameter maupun form, akan tetapi bukan berarti seorang developer boleh membiarkan variabel tetap kosong melompong. Bila settings register_global dimatikan (dan sangat dianjurkan untuk dimatikan), maka sebenarnya tidak terlalu menjadi masalah bila tidak menggunakan nilai default untuk suatu input, walaupun dengan menggunakannya tetap akan menjamin data yang ada tetap aman dan “sesuai dengan jalurnya”. Untuk mengevaluasi suatu input itu kosong, dapat digunakan isset() atau empty().

Menghapus dan mengevaluasi karakter dan string. Dalam beberapa kasus, developer tidak selalu memerlukan beberapa karakter dalam user input. Developer dapat melakukan pemeriksaan terhadap suatu karakter atau format string menggunakan regular expression yang dikenal powerfull dalam mengolah string dan kemudian menampilkan notifikasi kesalahan pada form input. Karakter white-space seperti spasi, tab, dan null pada awal dan akhir dari input juga dapat dihapus menggunakan fungsi trim(), ltrim(), rtrim() sesuai dengan keperluan. Bila perlu, beberapa karakter juga dapat di-replace untuk mengurangi kemungkinan injeksi.

Melakukan checking pada file yang diupload. Terkadang dalam suatu form, user juga diperbolehkan mengirimkan file atau berkas ke server. Memperbolehkan user mengupload suatu file berarti membuka jalur yang lebih besar lagi bagi user dalam mengontrol server. Beberapa hal yang dapat dimanfaatkan untuk mengambil alih server adalah nama file, tipe file, dan isi file.

Nama file yang tidak divalidasi atau disanitasi menggunakan metode di atas bisa membuat user mengakses direktori yang tidak seharusnya, misalnya direktori parent yang bisa diakses menggunakan “..” (double dot) atau root dengan “/” (slash). Tipe file dapat dimanfaatkan oleh user untuk mengupload script PHP atau lainnya dan menjalankan scriptnya dari jauh (remotely). User juga mungkin mengupload suatu file yang berbahaya (virus dan sebagainya) atau mungkin mengupload suatu file yang tidak sesuai dengan tipenya (file extension masking). Ketiga hal ini merupakan hal yang harus dipertimbangkan sebelum mengimplementasikan fungsi untuk mengupload file dalam suatu web.

Fungsi yang penting untuk digunakan dalam memproses file upload adalah is_uploaded_file() dan move_uploaded_file(). Jangan menggunakan rename() atau copy() untuk memindahkan file yang sudah di-upload karena PHP tidak akan mengecek ulang apakah file yang dipindahkan adalah file hasil upload atau bukan.

Mencoba menginjeksi input dan melakukan debugging. Hal ini merupakan salah satu hal yang cukup sulit diimplementasikan mengingat melakukan test dari pihak developer sendiri berarti hanya melakukan suatu hasil yang diharapkan oleh developer. Selain itu karena memakan waktu yang lama dan menjadi sangat sulit bila program yang dites merupakan program yang besar. Bila program yang dikerjakan kecil, maka melakukan testing dan mencoba menginjeksi kode merupakan salah satu hal yang bagus untuk mendeteksi celah keamanan. Mozilla Firefox sendiri menyediakan addons untuk membantu developer melakukan injeksi secara masif pada setiap user input. Selain itu testing dapat dilakukan dengan melemparkan tahap beta atau uji coba kepada user atau tim tester agar dapat menemukan bug atau masalah pada program yang dibuat.

Itulah beberapa hal yang dapat dilakukan untuk menjaga agar input dari user tidak terlalu berbahaya. Loh, kenapa tidak terlalu berbahaya? Karena apa saja bisa terjadi di masa yang akan datang untuk memanfaatkan celah yang ada ataupun yang belum terlihat sampai saat ini.

Anyway, don’t ever ever trush user input. Even if your users are good or expert, you don’t know what will happen with their input. Bahkan user normal yang tidak sengaja salah memasukkan input ke web Anda saja bisa membuat satu situs rusak total. Percayakah Anda? Percayalah. ;)

Dikutif dari : https://etersoul.com/2008/11/08/input-sanitizing-on-php/

MAU PUNYA WEBSITE PROFESIONAL?

Silakan klik salah satu tombol cepat di bawah ini untuk menghubungi kami