|
[096].
Keamanan Login Pada web PHP
------------------------------------------------------
Author : Aku ya Aku
Contact : -
CopyLEFT (c) 2006
www.spyrozone.tk All Rights Reserved
� 15/09/2005 22:45:11 WIB
------------------------------------------------------
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");
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"); 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");
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");
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"); 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
/* ------------------------------|EOF|------------------------------ */
|