Keamanan Login pada Web php

Sumber : spyrozone

Tulisan ini diperuntukan bagi para newbie yang ingin membuat system login pada webnya dengan php. Saya akan melampirkan beberapa hal dasar yang harus kita perhatikan ketika membuat system login beserta contoh script sederhana. Apa yg akan saya paparkan berikut ini sebenarnya sangat umum dan dapat diperoleh dari berbagai sumber yang berhub dgn php. Semoga dapat memberi sedikit info tambahan untuk newbie-newbie baru.Ok langsung kita mulai.

Berikut ini hal-hal yg harus kita pertimbangkan ketika membuat login:
1.Pastikan form login adalah form dari server kita.
2.Amankan input text untuk user dan password,metoda dan format data.
3.Hindari penggunaan register global (untuk php v 4.2.0 keatas sdh disable).
4.Expired time dari login yang dilakukan.
5.Pastikan file yang tidak boleh diakses tidak dapat dipanggil secara langsung.

Sekarang contoh dari script untuk hal-hal tersebut.Saya hanya melampirkan satu logika dari banyak kemungkinan lain dalam membuatnya.Logika ini akan sangat beragam jadi bukanlah satu-satunya cara ataupun cara yang paling baik,silahkan buat sendiri untuk yg lebih baik atau lihat referensi lain.

1.Pastikan form login berasal dari server kita:

//file ini bernama index.php
<?php session_name(“secretsession”); session_start(); session_register(“SES_TOKEN”); $token=createRandomtoken(); $enctoken=enc_token($token); $SES_TOKEN=$enctoken; ?> <head><title>login</title></head><body><table><form method=”post” action=”cekmasuk.php”><input type=”hidden” name=”form” value=”login”><tr><td>Username</td><td>:</td><td><input type=”text” size=”10″ name=”user”></td></tr><tr><td>Password</td><td>:</td><td><input type=”password” size=”10″ name=”password”></td></tr><tr><td colspan=’3′ align=’center’><input type=”hidden” name=”enctoken” value=”<?=$enctoken?>”><input type=”submit” name=”submit” value=” Login
“><input type=”submit” value=” cancel”></td></tr></form></table></body><?php //mulai fungsi untuk membuat kata random function createRandomtoken() { $sumber = “abcdefghijkmnopqrstuvwxyz023456789”; srand((double)microtime()*1000000); $i = 0; while ($i <= 5) { $num = rand() % 33; $char = substr($sumber, $num, 1); if (!strstr($token, $char)) { $token .= $char; $i++; } } return $token; }
//fungsi untuk meng-enkripkan token memakai fungsi md5 function enc_token($token) { $hash = md5($token); return $hash; } ?>

//akhir script index.php

-saat membuat form login(ex: index.php)sebagai default kita mulai dengan membuat session baru.
-session_name disini sebagai refrensi untuk session id di cookies dan URL.
-lalu daftarkan suatu variabel session baru SES_TOKEN dgn memakai fungsi session_register.
-Buat token berupa kata acak yg akan kita gunakan utk memastikan form-adalah dari kita.
-Lalu Encript token agar lebih rumit.(Pada dasarnya token ini mirip dgn session id)
-Tambahkan variabel enkript token tsb dalam form melalui hidden.
-Lalu pada file “cekmasuk.php” kita lakukan pemeriksaan apakah data yg kita terima dari form yg kita buat sebelumnya, akan saya jelaskan pada script cekmasuk.php.

2.Amankan input text untuk user dan password,metoda dan format data.
Pada saat kita menerima data maka sebelum kita olah data tersebut(utk kasus ini adalah user dan password),maka harus kita pastikan data tersebut tidak disisipi niat jahat. Untuk itu maka kita buat suatu fungsi filter,fungsi ini akan kita gunakan pada script
cekmasuk.php yang akan saya lampirkan diakhir.
//fungsi filter

function filter($word) { $word = stripslashes(trim($word)); $word = nl2br($word); $word = htmlentities($word); return $word ; }

Ini hanya contoh simple dengan memanfaatkan fungsi yg ada di php.Kita dapat tambahkan dengan membuat fungsi sendiri, misalkan filter kata-kata kotor(dijasakom sudah ada yg melampirkan),atau memanfaatkan regex untuk validasi yg lain.Silahkan berkreasi.

3.Hindari penggunaan register global (untuk php v 4.2.0 keatas sdh disable/off).
Untuk hal ini maka kita dapat memperoleh data yg dikirim melalui predefine variabel milik php,yaitu:
$HTTP_GET_VARS(untuk metoda get).
$HTTP_POST_VARS(untuk metoda post).dan masih ada lagi yg lainnya.

4.Expired Time dari login yang dilakukan.
Setiap login yg dilakukan user sering kali mereka tidak melakukan logout,hanya mendiamkan atau malah meninggalkan ketika masih login.Oleh karena itu expired time ini adalah wajib dalam sistem login.
Script secara lengkap akan ada pada script “cekmasuk.php”.

$refresh_time=10; //dalam menit $chour = date(“H”); //jam $cmin = date(“i”); //menit $csec = date(“s”); //detik $cmon = date(“m”); //bulan $cday = date(“d”); //tanggal $cyear = date(“Y”); //tahun
//waktu saat ini ketika mengakses $ctimestamp = mktime($chour,$cmin,$csec,$cmon,$cday,$cyear);
//penambahan waktu mengakses akan digunakan untuk expired time $ttimestamp = mktime($chour,$cmin+$refresh_time,$csec,$cmon,$cday,$cyear);

5.Pastikan file yang tidak boleh diakses tidak dapat dipanggil secara langsung.
Berikan fungsi berikut disetiap awal script yg tdk anda inginkan dapat diakses langsung

if(ereg(‘cekmasuk.php’, $SCRIPT_NAME)) { header(“Location: http://domainanda.com/index.php&#8221;); die; }
/********************************************************************/ // //script akan menerima metoda post dari index.php //file ini bernama cekmasuk.php<? if(ereg(‘cekmasuk.php’, $SCRIPT_NAME))

{ header(“Location: http://domainanda.com/index.php&#8221;); die;

}

if($submit and $user<>”” and $password<>””)

{ session_name(“secretsession”); session_start(); switch ($_POST[‘form’]) { case ‘login’: $allowed = array(); $allowed[] = ‘form’; $allowed[] = ‘user’; $allowed[] = ‘password’; $allowed[] = ‘enctoken’; $allowed[] = ‘submit’; $sent = array_keys($_POST); if ($allowed == $sent) { if($_POST[‘enctoken’]<>$SES_TOKEN)//periksa apakah form berasal dari kita atau session yg sama { //jika tidak maka kembali ke form session_destroy(); header(“Location: http://domainanda.com/index.php&#8221;); exit; }
else { $clean_user=filter($_POST[‘username’]);//bersihkan inputan $clean_password=filter($_POST[‘password’]); //definisi waktu untuk expired time if (authentication($clean_user,$clean_password))//cek user dalam database { $refresh_time=10; //dalam menit $chour = date(“H”); //jam $cmin = date(“i”); //menit $csec = date(“s”); //detik $cmon = date(“m”); //bulan $cday = date(“d”); //tanggal $cyear = date(“Y”); //tahun $ctimestamp = mktime($chour,$cmin,$csec,$cmon,$cday,$cyear); $ttimestamp = mktime($chour,$cmin+$refresh_time,$csec,$cmon,$cday,$cyear); session_register(“SES_PASSWORD”);//daftarkan session variabel baru session_register(“SES_USERNAME”); session_register(“SES_HASH”); session_register(“T_TIMESTAMP”); $T_TIMESTAMP=$ttimestamp; $hashtoken=createRandomtoken();//buat token baru untuk disisipkan dalam setiap page system login
$enchash=enc_token($hashtoken);//token ini akan memastikan page hanya yg dari server dengan session yg sama $SES_HASH=$enchash; $SES_USERNAME=$clean_user; $SES_PASSWORD = $clean_password; } else { unset ($submit); unset ($user); unset ($password); } } } break; } } else { session_name(“secretsession”); session_start(); opendb(); $query= “select * from $table_admin where nama=’$SES_USERNAME'”;//misalkan
database user ada pd table admin $hasil= querydb($query); $data= mysql_fetch_array($hasil); closedb(); $USERNAME = $data[“nama”]; $PASSWORD = $data[“password”]; $HASH_TOKEN=$hash_token;
//untuk exired timed $refresh_time=10; //dalam menit $chour = date(“H”); //jam $cmin = date(“i”); //menit $csec = date(“s”); //detik $cmon = date(“m”); //bulan $cday = date(“d”); //tanggal $cyear = date(“Y”); //tahun $ctimestamp = mktime($chour,$cmin,$csec,$cmon,$cday,$cyear); $ttimestamp=$T_TIMESTAMP; if ($ttimestamp < $ctimestamp) { session_unregister(“SES_PASSWORD”); session_unregister(“SES_USERNAME”); session_unregister(“SES_HASH”); session_unregister(“T_TIMESTAMP”); session_destroy(); header(“Location: http://domainanda.com/index.php&#8221;); exit; } $ttimestamp = mktime($chour,$cmin+$refresh_time,$csec,$cmon,$cday,$cyear); $T_TIMESTAMP=$ttimestamp; }

/********************************************************************/ //mulai fungsi pendukung function authentication($user, $pass) { global $table_admin; opendb(); $query=”select * from $table_admin where nama=’$user'”; opendb(); $hasil=querydb($query); closedb(); $data = mysql_fetch_array($hasil); $pass_inDB=$data[“password”]; $enc_pass = md5($pass); if($pass_inDB == $enc_pass) { return TRUE; } else { return FALSE; } closedb(); } ?>
/********************************************************************/

Script tersebut dapat kita gunakan pada page yg berada dalam system login,ex: udahmasuk.php Maka dapat kita memanfaatkan dengan cara berikut:

//File ini bernama udahmasuk.php<?php include “cekmasuk.php”; if(!authentication($SES_USERNAME, $SES_PASSWORD)) { session_unregister(“SES_PASSWORD”); session_unregister(“SES_USERNAME”); session_unregister(“SES_RAWTOKEN”); session_unregister(“SES_HASH1”); session_unregister(“SES_LOG”); session_unregister(“T_TIMESTAMP”); session_destroy(); header(“Location: http://domainanda.com/index.php&#8221;); exit; } else { //silahkan ketik script php milik anda untuk membuat page disini //jangan lupa selalu sertakan enctoken pada setiap page yg anda bentuk //untuk dicek dgn yg berada pada session anda } ?>
-Fungsi opendb(),querydb(),closedb() adalah fungsi yg sy buat utk akses database,silahkan anda buat sendiri.
-Dengan menggunakan script tersebut bukan berarti kita telah membuat system login yg aman.Ingat ini hanya”Beberapa Hal Dasar”.
-Penambahan kata rahasia pada pembentukan token bisa menambah tingkat kesukaran untuk di tebak.
-Akhir kata seluruh hasil script tersebut bukanlah murni pemikiran saya tetapi merupakan penggabungan dari berbagai script yg sudah ada baik dari contoh help php, dan beberapa tulisan lain diantaranya adalah milik Chris Shiflett dan Jeff Johns.
-Untuk lebih jelas bagaimana memakai fungsi yg ada silahkan “RTFM”.
-Agar lebih mendalami masalah keamanan php silahkan kunjungi Chris Shiflett artikel di http://shiflett.org
-Tulisan Jeff Johns dapat anda lihat di http://www.phpfreaks.com

~ oleh gandhiprima pada 11 Januari, 2008.

3 Tanggapan to “Keamanan Login pada Web php”

  1. Oh ya kalau kesulitan mengurutkan skrip di atas, pake aja PHP Designer. ada Fasilitas beautify code, tinggal klik satu tombol saja, skrip yang amburadul sudah tertata rapi seperti skripnya profesional saja. Atau bisa juga pakai Eclipse for PHP. Kalo Dreamweaver, kayaknya nggak ada dech, harus manual diurutin satu-satu. Semoga membantu. heeeee

    Admin says : nah tu…ada tips tambahan buat pembaca…hehe…. thank’s bro…

  2. beritahu dmn ya bisa donlot software PHP Designer?. yang sgt pemula seperti aku ini, masih bingung dgn scrips diatas.apa ada referensi untuk pelajari dan apa maksud step by step scrip diatas dan fungsinya, Mohon pencerahannya. aku tunggu infonya di mail aku. terima kasih

  3. susah bacanya, boleh donlod syntaxnya ga ?

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

 
%d blogger menyukai ini: