Keamanan Login Pada web PHP

irigster

New member
Date: Friday, October 07, 2005 Hits: 10615 By: aku ya aku
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 Chris Shiflett: PHP and Web Application Security
-Tulisan Jeff Johns dapat anda lihat di PHP Help: PHP Freaks!
Source: JASAKOM Information Center
 
Back
Top