Membuat Aplikasi PHP Yang Aman Bag. 2
Sambungan dari:
Membuat Aplikasi PHP Yang Aman Bag. 1
2. Pergunakan Anti SQL Injection
SQL Injection merupakan teknik menyusupkan perintah SQL kedalam query dengan cara memanipulasi input data pada sebuah aplikasi. Anda bisa membaca dan mempelajari bagaimana SQL injection dapat terjadi di SQL Injetion Attack by Example.
Bagaimana menanggulanginya? Berikut adalah fungsi Anti SQL Injection yang sering saya pergunakan.
[php]
function anti_sql_injection( $input ) {
// daftarkan perintah-perintah SQL yang tidak boleh ada
// dalam query dimana SQL Injection mungkin dilakukan
$aforbidden = array (
“insert”, “select”, “update”, “delete”, “truncate”,
“replace”, “drop”, ” or “, “;”, “#”, “–”, “=” );
// lakukan cek, input tidak mengandung perintah yang tidak boleh
$breturn=true;
foreach($aforbidden as $cforbidden) {
if(strripos($input, $cforbidden)) {
$breturn=false;
break;
}
}
return $breturn;
}
[/php]
Cara memanfaatkan fungsi tersebut adalah sebagai berikut (contoh pada proses login dimana SQL injection kerap dilakukan)
[php]
if(anti_sql_injection($_POST['user']) and
anti_sql_injection($_POST['password'])) {
// lakukan proses login
} else {
die();
}
[/php]
Selain itu, SQL injection juga dapat dicegah dengan pengaturan priveleges pada database yang dipergunakan. Misalnya, bagian situs yang hanya berfungsi memperlihatkan data melalui query select menggunakan user dengan privelege select saja. Bagian situs yang berfungsi untuk memberi kesempatan pembaca untuk berkomentar menggunakan user dengan privelege insert saja dst.
3. Pergunakan session_regenerate_id() Untuk Pembuatan Session
Selintas penggunaan session adalah teknik yang aman untuk menjaga sebuah halaman agar tidak bisa dikunjungi oleh sembarang orang. Misalnya, pemanfaatan session untuk halaman administrasi sebuah situs. Namun, session pun memiliki titik kelemahan yang bisa dieksploitasi attacker dan dipergunakan sebagai senjata untuk menyerang sistem aplikasi.
Cara paling mudah untuk memanfaatkan session sebagai titik kelemahan sistem aplikasi adalah menggunakan metode fixation. Session faxation adalah metode dimana seorang attacker menyerang browser user sebelum login dilakukan. Yaitu dengan memasukkan id session untuk kemudian dimanfaatkan dengan tujuan tertentu.
Berikut adalah ilustrasi bagaimana session fixation dilakukan untuk menyerang keamanan sistem aplikasi berbasis web.
[php]
session_start();
if($_SESSION['id_user']<>13) {
// Proses login (authentifikasi)
// Jika login sukses, jalankan perintah dibawah ini
$_SESSION['id_user']=13;
} else {
if($_SESSION['id_user']==13) {
// lakukan proses A
}
[/php]
Script diatas adalah bagian dimana variable id_user (13) didaftarkan sebagai variable session JIKA pengunjung belum login dan login yang dilakukan sukses. Artinya, jika login pernah dilakukan maka halaman ini tidak akan melakukan proses login dan langsung melakukan proses A.
Langkah selanjutnya, pastikan bahwa browser yang digunakan bersih dari session sebelumnya. Lalu ketikan alamat script diatas dengan menambahkan PHPSESSID=1804.
Misalnya nama file script diatas adalah test.php dan diletakkan di server.com, maka yang harus Anda tuliskan adalah http://server.com/test.php?PHPSESSID=1804 dan lakukan login. Setelah itu, silakan Anda mencoba mengakses alamat tersebut diatas menggunakan browser lain atau komputer lain yang terhubung dengan server.com. Hasilnya, Anda akan melakukan proses A tanpa melakukan login!
Hal diatas terjadi akibat id session yang dipergunakan saat session dibentuk adalah sama dengan id session yang sebelumnya telah diketikkan secara “paksa” dalam URL. Untuk menanggulangi hal ini, diperlukan fungsi untuk meng-generate ulang id session yaitu dengan menggunakan fungsi session_regenerate_id() sehingga bagian script diatas menjadi seperti dibawah ini:
[php]
session_start();
if($_SESSION['id_user']<>13) {
// Proses login (authentifikasi)
// Jika login sukses, jalankan perintah dibawah ini
session_regenerate_id();
$_SESSION['id_user']=13;
} else {
if($_SESSION['id_user']==13) {
// lakukan proses A
}
[/php]
Secara default, penggunaan fungsi session_regenerate_id() tidak serta merta akan menghapus session sebelumnya secara otomatis. Agar session_regenerate_id() menghapus/menghancurkan session sebelumnya, Anda perlu menambahkan parameter boolean true pada fungsi tersebut. Sayangnya, parameter ini hanya bisa digunakan untuk PHP dengan versi 5.1.0 keatas.
[...] Bersambung ke Membuat Aplikasi PHP Yang Aman Bag. 2 [...]
[-( gak nyadar kalo user auth gw masih rentan... makasih artikelnya
Salam knal mas,
Wah tutorial yang keren…
Ya, memang kita kadang-kadang ceroboh dan kurang ati-ati..
makasih atas tipsx,,,,,,,,,
n mohon tips2 selajutnya
:) terimakasih buat artikelnya cukup membantu….
sekalian saya juga mau nanya trik ajax & php… saya bermaksud memperdalam ajax karena response yang dihasilkan sangat cepat. sepertinya ajax akan menjadi alternatif baru yang cukup baik.
mau nanya nech, gimana misalnya saya ingin buat user dengan 2 level user. misalnya login untuk mhs dan administrator, jadi ketika belum login tampilan website akan seperti biasanya, ketika telah login di halaman index maka admin akan langsung di alihkan ke halaman admin/index.php. untuk mahasiswa mereka akan ada pesan bahwa mereka telah login sebagai mhs dengan nama (misalnya adi) bingung nech ?? and untuk masalah tabel di database nya gimana, apa perlu juga buat status di database user, misalnya admin status nya 1, mhs statusnya 2 ……… gimana ya ?? bingung nech ??
baru tahu kalo ada sql injection nih… hehehe…
asik deh… makasih… infonya bermanfaat banget…
ngeri juga yah kalo orang lain bisa nge-drop table di database gitu..
gimana bisa juga gak kalo :
$input = trim($_POST['anu']);
$inputoke = str_replace(‘drop’, ”, $input); etc…
$input = trim($_POST['anu']);
// salah gak ya, gak dicoba dulu sih
for($a=0; $a
yah yang terakhir gak masuk (udah nye-cript panjang2x gak masuk), ok saya ulang…
// coba dibuat atau dikembangkan dari array diatas menjadi di replace saja, misalkan kata “drop” direplace menjadi dikosongkan , menjadi “d.” atau lainya (drop) or etc , maksudnya supaya visitor (misalnya) tidak kelelahan mendapati pesan error yang bertubi2x dan akhirnya malah jadi males daftar. (contoh aplikasi e-commerce)
karena bisa saja kata drop misalnya, mungkin diperlukan waktu melakukan input contoh aja sampai masa yang akan datang misal lagi ada orang yang punya nama : Jainudin Drop Wardi hehehe sapa tahu !
bisa diganti dengan Jainudin d. Wardi
alternatif replace, juga bisa bikin si Hacker kegeeran merasa usahanya sudah sukses dan keuntungan lain (meskipun kita sudah menyiasatinya) namun hacker tidak tahu apa saja yang sudah di “hadang” oleh script kita. jadi biar hacker muter2x dulu sampe bosen …
mudah2x an gak salah.
thank’s
mas. mo nanya. pas aku nyoba buat session() kenapa sich gagal mlulu2 padahal aku udah bener. pa mungkin variabel global pada php.ini di on atau di off kan?