• Tidak ada hasil yang ditemukan

BAB III METODOLOGI PENELITIAN

4.4. Implementasi

Pada tahap ini dilaksanakan implementasi dari rancangan-rancangan, baik rancangan basis data, rancangan aplikasi, maupun rancangan tampilan.

4.4.1. Bahasa Pemrograman dan Komponen

Bahasa pemrograman dan komponen-komponen yang digunakan dalam pengembangan sistem ini adalah:

1. Application server : Apache 2.2.17 2. PHP version 5.3.5

3. MySql version 5.5.8

4. Framework: Codeigniter 2.0.2

4.4.2. Struktur File

Karena aplikasi ini merupakan penerapan dari Codeigniter framework, maka dalam penyusunan struktur file juga harus mengikuti standar baku yang dimiliki codeigniter framework itu sendiri.

Tabel. 4.28. Struktur file

Struktur file Keterangan

manajemen_surat/application/config Konfigurasi aplikasi, server, dan database

manajemen_surat/application/controllers Source code logika control aplikasi manajemen_surat/application/models Source code fungsi-sungsi

pengelolaan struktur data manajemen_surat/application/views Source code tampilan

4.4.3. Alur Kerja CodeIgniter Framework

Secara umum alur kerja framework Codeigniter adalah sebagai berikut:

Gambar. 4.80. Alur kerja framework Codeigniter

Index.php merupakan front controller atau file yang berhubungan langsung dengan user. Saat user membuka index.php dan melakuka request, maka akan dicek melalui router alamat yang dimasukkan oleh user tersebut. Bila ada paca cache data, maka akan langsung menuju ke Caching dan kembali lagi ke user. Bila pada cache tidak ada makan akan diteruskan ke security untuk menvalidasi, menyaring, dan mengamankan informasi yang dimasukkan user (bila ada). Lalu dari security informasi tersebut dikirim ke application controller. Di application controller, informasi dan data akan diolah. Bila diperlukan, application controller akan berhubungan dengan models, libraries, helpers, plugins, atau skrip lainnya. Application controller akan mengirimkan respon ke view untuk ditampilkan ke user. View akan disimpan di cache bila berikutnya melakuka request yang sama. Sehingga mempercepat proses. Setelah di cache, maka akan ditampilkan informs kepada user.

Dalam implementasinya pada sistem informasi manajemen surat dan pengarsipan dapat diuraikan sebagai berikut:

a. Routing

Ketika pertama kali mengakses aplikasi melalui web browser, maka halaman yang pertama dipanggil adalah halaman index.php pada folder aplikasi. Setelah itu file index.php melakukan routing ke controller yang telah di config oleh programmer pada file manajemen_surat/application/config/ routes.php dimana isinya adalah sebagai berikut:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$route['default_controller'] = "login";

Dari code di atas, maka sistem akan menjalankan controller login.php yang bersisi sebagai berikut:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends CI_Controller { public function index()

{

$cssHeader = '<link rel="stylesheet" href="'.base_url().'/css/login.css">';

$cssHeader .= '<link rel="stylesheet" href="'.base_url().'/css/login.css">'; $data['cssHeader'] = $cssHeader; $this->load->model('model_user'); $data['resultDir'] = $this->model_user- >get_bagian(); $data['resultJab'] = $this->model_user- >get_jabatan(); $this->load->view('login/index',$data); }

public function cek() { $this->load->model('model_login'); $this->model_login->cek_login(); } } ?>

Dari code controller login.php pada baris terakhir dari function index(), sistem memanggil file manajemen_surat/application/views/login/index.php yang berisi sebagai berikut:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Manajemen Surat PT xyz</title> <link rel="stylesheet" href="<?php echo base_url();?>/css/login.css" />

<script>

var animasi1 = "Sistem Informasi Manajemen Surat"; var animasi2 = "PT XYZ ";

var delay = 500; b1(); function b2() { ID = setTimeout("b1()",delay); document.title = (animasi1); } function b1() { ID = setTimeout("b2()",delay); document.title = (animasi2); } </script> </head> <body> <div id="login_box">

<form action="<?php echo

site_url("login/cek");?>" name="frmLogin" method="post">

<table width="350" border="0"> <tr> <td colspan="3" id="icon"><h1>Login Aplikasi</h1></td> </tr> <tr> <td width="122"><label>Username</label></td>

<td width="14">:</td> <td width="250"><input type="text" name="username" id="username" /></td> </tr> <tr> <td><label>Password</label></td> <td>:</td>

<td><input type="password" name="password" id="password" /></td> </tr> <tr> <td><label>Jabatan</label></td> <td>:</td> <td> <?php echo $this->fungsi-> create_comboboxX('jabatan',$resultJab,'i d_jabatan','nama_jabatan','','','');?> </td> </tr> <tr> <td colspan="3">&nbsp;</td> </tr> <tr> <td colspan="3" align="center"> <input type="submit" value="login" id="tombol" />&nbsp;&nbsp;&nbsp;

<input type="reset" value="cancel" id="tombol" />

</td> </tr> </table>

<div align="center"><font color="#FF0000" size="+1"><?php echo $this->session-

>flashdata('errorLogin');?></font></div> </form>

</div> </body> </html>

Jadi secara singkat proses routing framework codeigniter yaitu ketika user mengakses aplikas pada web browser, maka sistem akan memanggil controller yang telah di set pada file config routes. Setelah itu controller

memanggil file view, jadi halaman yang tampil paa web browser adalah file view yang ditentukan controller.

b. Sistem Informasi Data

Dalam sebuah sistem informasi tentunya ada proses create, update, delete, dan view data. Pada penerapannya dengan framework codeigniter keempat proses tersebut tidak berbeda jauh karena sama-sama melibatkan controller sebagai logika sistem, model sebagai query database dan view sebagai tampilan, sehingga penulis hanya akan menjelaskan proses view data dan sebagai contoh pada saat view data user dengan aktornya adalah admin.

Saat akan melakukan view data, maka admin diharuskan login terlebih dahulu. Setelah login, admin memilih menu user management, kemudian mengklik menu user. Pada menu view data user, web browser mendapatkan link “…/manajemen_surat/index.php/user/get_user”, dari link tersebut dapat dijelaskan bahwa sistem akan menuju “function get_user()” yang berada dalam file controller “admin” sebagai berikut:

<?php

class User extends CI_Controller { public function get_user() {

$kategori=$this->input->post('kategori');//echo $kategori;

$cari=$this->input->post('cari'); if($kategori=='' and $cari==''){

$this->db->select('a.id_user,a.username, a.nik,a.password, a.nama_user, b.nama_bagian, a.last_login,a.authority'); $this->db->from('mst_user a,mst_bagian b'); $this->db->where('a.id_bagian =b.id_bagian'); $this->db->order_by('a.id_user','DESC');

$this->db->select('a.id_user,a.username, a.nik,a.password, a.nama_user, b.nama_bagian, a.last_login,a.authority'); $this->db->from('mst_user a,mst_bagian b'); $this->db->where('a.id_bagian =b.id_bagian'); $this->db->like($kategori,$cari); $this->db->order_by('a.id_user','DESC'); }elseif($kategori=='semua' and $cari==''){

$this->db->select('a.id_user,a.username, a.nik,a.password, a.nama_user, b.nama_bagian, a.last_login,a.authority'); $this->db->from('mst_user a,mst_bagian b'); $this->db->where('a.id_bagian =b.id_bagian'); $this->db->order_by('a.id_user','DESC'); } $getData = $this->db->get(''); $a = $getData->num_rows();//echo $a; $config['base_url']=base_url().'index.php/user/get _user/'; //set the base url for pagination $config['total_rows'] = $a; //total rows

$config['per_page'] = '10'; //the number of per page for pagination

$config['uri_segment'] = 3; //see from base_url. 3 for this case

$config['full_tag_open'] = '<p>'; $config['full_tag_close'] = '</p>'; $this->pagination->initialize($config);

//initialize pagination

$data['title'] = 'menampilkan isi user'; $data['list_user'] = $this->model_user- >get_all($config['per_page'],$this->uri- >segment(3),$kategori,$cari); $this->load->view('header',$data); $this->load->view('user/index', $data,$a); $this->load->view('footer'); }

Pada baris “$data['list_user'] = $this->model_user- >get_all($config['per_page'],$this->uri->segment(3),

$kategori,$cari);”, fungsi get_user() pada controller user ini akan

memanggil fungsi get_all() pada file model_user.php yang terletak di manajemen_user/application/models/… yang isinya sebagai berikut:

<?php

class Model_user extends CI_Model {

public function get_all($perPage,$uri,$kategori, $cari) {

if($kategori=='' and $cari==''){

$this->db->select('a.id_user,a.username,a.nik, a.password, a.nama_user, b.nama_bagian, a.last_login,a.authority');

$this->db->from('mst_user a,mst_bagian b'); $this->db->where('a.id_bagian = b.id_bagian'); $this->db->order_by('a.id_user','DESC');

$getData = $this->db->get('', $perPage, $uri); if($getData->num_rows() > 0)

return $getData->result_array(); else

return null;

}elseif($kategori!='' and $cari!=''){

$this->db->select('a.id_user,a.username,a.nik, a.password, a.nama_user, b.nama_bagian, a.last_login,a.authority');

$this->db->from('mst_user a,mst_bagian b'); $this->db->where('a.id_bagian = b.id_bagian'); $this->db->like('a.'.$kategori,$cari);

$this->db->order_by('a.id_user','DESC');

$getData = $this->db->get('', $perPage, $uri); if($getData->num_rows() > 0) return $getData->result_array(); else return null; }elseif($kategori=='semua'){ $this->db->select('a.id_user,a.username,a.nik, a.password, a.nama_user, b.nama_bagian, a.last_login,a.authority');

$this->db->from('mst_user a,mst_bagian b'); $this->db->where('a.id_bagian = b.id_bagian'); $this->db->order_by('a.id_user','DESC');

$getData = $this->db->get('', $perPage, $uri); if($getData->num_rows() > 0) return $getData->result_array(); else return null; } }

Pada baris code diatas terdapat tiga query dalam sql yang dapat dilakukan yaitu ketika parameter $kategori dan $cari kosong, maka akan menjalankan

query “SELECT a.id_user, a.username, a.nik, a.password, a.nama_user, b.nama_bagian, a.last_login, a.authority FROM mst_user a, mst_bagian b WHERE a.id_bagian = b.id_bagian ORDER BY a.id_user DESC”, kemudian jika parameter $kategori dan $cari tidak kosong, maka akan menjalankan query “SELECT a.id_user, a.username, a.nik, a.password, a.nama_user, b.nama_bagian, a.last_login, a.authority FROM mst_user a, mst_bagian b WHERE a.id_bagian = b.id_bagian LIKE a. $kategori, $cari ORDER BY a.id_user DESC”, dan ketika parameter $kategori berisi ‘semua’, maka ajan menjalankan query “SELECT a.id_user, a.username, a.nik, a.password, a.nama_user, b.nama_bagian, a.last_login, a.authority FROM mst_user a, mst_bagian b WHERE a.id_bagian = b.id_bagian ORDER BY a.id_user DESC”.

Kembali lagi pada fungsi get_user() pada controller user, setelah memanggil query database dilanjutkan memanggil file view pada baris

“$this->load->view('user/index', $data,$a);”. Baris

tersebut memanggil file index.php pada folder “manajemen_user/application/ view/user/” yang nantinya akan ditampilkan di web browser yang berisi sebagai berikut:

<div id="main-content"> <br />

<div class="product-main">

<div class="judul" align="center" style= "width:780px;"><h2>MANAGE USER</h2></div>

<table>

<form method="post" name="frmCari" id="frmCari" onsubmit="return val_cari();" action="<?php echo site_url('user/get_user'); ?>">

<select name="kategori" id="kategori" onchange="enabledisabletext();" >

<option value="kosong">:: pilih ::</option> <option value="semua">semua</option>

<option value="nik">nik</option>

<option value="nama_user">nama user </option>

<option value="jenis_kelamin">jenis kelamin </option>

</select>

<input type="text" name="cari" id="cari" size="15"/>

<input type="submit" value="cari"/> </form>

</table>&nbsp;

<form name="frmCetakALLUser" id="frmCetakALLUser"

method="post" action="<?php echo site_url('user/cetak_ALLuser'); ?>">

<input type="submit" value="cetak ALL ke ms.excel" />

</form> <br />

<form name="frmCetakUser" id="frmCetakUser" method="post" action="<?php echo site_url('user/cetak_user'); ?>">

<table width="108%" border="0" style="border:solid 1px;"> <tr> <th width="4%">No</th> <th width="4%">NIK</th> <th width="11%">Username</th> <th width="14%">Nama User</th> <th width="18%">Nama Bagian</th> <th width="24%">Last Aktifitas</th>

<th colspan="3" align="center" style= "padding-left:50px;" valign="middle">

<?php

if($authority==1){ ?>

<a href="<?php echo base_url();?>index.php/ user/index/add"><img src="<?php echo base_url();?>/images/2.png" border="0"/></a> <?php } ?> </td>

</tr> <?php $banyakData=count($list_user); if($banyakData > 0){ $no=1; foreach($list_user as $us){ if($no%2==0){ $bcg="#CCC"; }else{ $bcg="#FFF"; } ?> <tr bgcolor="<?php echo $bcg;?>"> <td><?php echo $no;?></td> <td><?php echo $us['nik'];?></td> <td><?php echo $us['username'];?></td> <td><?php echo $us['nama_user'];?></td> <td><?php echo $us['nama_bagian'];?></td> <td><?php echo $us['last_login'];?></td>

<input type="hidden" name="id[]" id="id" value="<?php echo $us['id_user'];?>">

<td width="6%"> <?php

if($authority==1){ ?>

<a href="<?php echo base_url();?>index.php/

user/index/edit/<?php echo $us['id_user'];?>"><img src="<?php echo base_url();?>/images/12.png" border="0"/></a> <?php } ?> </td> <td width="13%"> <?php if($authority==1){ if($us['authority']==1){ ?>

<a href="#" onclick="return confirm('data ini tidak boleh di hapus!')"><img

src="<?php echo base_url();?>/images/8.png" border="0"/></a> <?php }else{ ?>

<a href="<?php echo base_url();?>index.php/ user/delete/<?php echo $us['id_user'];?>" onclick="return confirm('anda yakin akan menghapus data ini?')"><img src="<?php

echo base_url();?>/images/8.png" border="0"/></a> <?php } } ?> </td> <td width="6%"> <?php $authority= $this->session- >userdata('authority'); if($authority==1 || $authority==0){ ?> <?php $atts = array( 'width' => '320', 'height' => '350', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '400', 'screeny' => '250' ); Echo anchor_popup('user/detail/'.$us

['id_user'].'', 'detail user', $atts);?> </td> <?php } ?> </tr> <?php $no++; } }else{ ?> <tr> <td colspan="8" style="padding-left:150px;

color:#F00"><strong>tidak ada data user</td>

</tr> <?php } ?>

<tr>

<td colspan="8"><p align="center"><?php echo $this->pagination->create_links();?></p>

</td> </tr>

<tr>

<td colspan="8"><input type="submit" value="cetak per-page ke ms.excel"

/>&nbsp;<input type="button" value="kembali" onclick="back();" /></td>

</tr> </table> </form>

Pada akhirnya admin akan melihat data-dat list user yang telah terdaftar di web browser.

c. Penerapan Keamanan

Pada sisi keamanan, framework codeigniter menyarankan beberapa metode yang kemudian diterapkan di dalam aplikasi ini yaitu XSS filtering dan anti SQL injection menggunakan escaping query.

XSS filtering

XSS merupakan kependekan yang digunakan untuk istilah cross site scripting. XSS merupakan salah satu jenis serangan injeksi code (code injection attack). XSS dilakukan oleh penyerang dengan cara memasukkan kode HTML atau client script code lainnya ke suatu situs. Serangan ini akan seolah-olah datang dari situs tersebut. Akibat serangan ini antara lain penyerang dapat mem-bypass keamanan di sisi klien, mendapatkan informasi sensitif, atau menyimpan aplikasi berbahaya. Untuk menghindari hal tersebut maka codeigniter menawarkan suatu settingan konfigurasi XSS filtering. Cara

mengaktifkannya adalah dengan merubah baris code pada “manajemen_surat/application/config/config.php” yang isinya:

$config['global_xss_filtering'] = FALSE; menjadi

$config['global_xss_filtering'] = TRUE;

Anti SQL Injection

SQL Injection adalah adalah sebuah teknik yang menyalahgunakan sebuah celah keamanan yang terjadi dalam lapisan basis data sebuah aplikasi. Celah ini terjadi ketika masukan pengguna tidak disaring secara benar dari karakter-karakter pelolos bentukan string yang diimbuhkan dalam pernyataan SQL atau masukan pengguna tidak bertipe kuat dan karenanya dijalankan tidak sesuai harapan. Ini sebenarnya adalah sebuah contoh dari sebuah kategori celah keamanan yang lebih umum yang dapat terjadi setiap kali sebuah bahasa pemrograman atau skrip diimbuhkan di dalam bahasa yang lain.

Untuk menghindarinya maka digunakan escaping query. Dalam penerapannya di aplikasi ini akan digunakan contoh proses pengambilan data user berdasarkan parameter id nya.

public function get_by_user($id){ $sql = "SELECT

a.id_user,a.nik,a.username,a.nama_user,a.jen is_kelamin,a.handphone,a.tgl_lahir,a.passwor d,a.email,a.alamat,a.id_bagian,a.id_jabatan, a.id_rootJab,a.authority,b.nama_bagian,c.nam a_jabatan,c.parent_jab from mst_user

a,mst_bagian b,mst_jabatan c where

a.id_user=".$this->db->escape($id)." and a.id_bagian=b.id_bagian and

a.id_jabatan=c.id_jabatan"; $result=$this->db->query($sql);

$data_user = $result->result_array(); return $data_user;}

4.5. Pengujian

Setiap program menjalani pengujian secara pribadi memastikan bahwa program yang telah di-develop bebas dari kesalahan (bug), walaupun tidak menutup kemungkinan masih terjadi sedikit bug atau tidak 100% bebas dari bug, namun pengujian ini setidaknya bisa meminimalisasi kesalahan yang akan terjadi.

Pengujian secara black box, yaitu suatu pendekatan untuk menguji apakah setiap fungsi di dalam program dapat berjalan dengan benar. Berikut beberapa proses yang dilakukan penulis dalam pengujian ini, yaitu:

1. Fungsi-fungsi yang tidak benar, baik input maupun output 2. Kesalah interface

3. Kesalahan dalam struktur data atau akses database

Di bawah ini merupakan table hasil pengujian dari aplikasi sistem informasi manajemen surat:

Tabel. 4.29. List hasil pengujian dengan pendekatan black-box No. Rancangan Proses Hasil yang diharapkan Hasil Keterangan

1. Mulai jalankan

program dengan mengklik icon aplikasi

Masuk halaman login Sesuai

2. Ketik nik pada field nik, password, dan jabatan admin, lalu klik login

Masuk halaman utama admin

Sesuai

3. Klik user manajemen Muncul dropdown user, bagian, jabatan, root jabatan

Sesuai

4. Klik user Masuk ke halaman data user

Sesuai 5. Klik tombol navigasi Masuk halaman input Sesuai

tambah tambah user 6. Isian field input

tambah user belum lengkap, lalu klik simpan

Data belum tersimpan ke database

Sesuai Nilai input invalid

7. Mengisi field input tambah user, lalu klik simpan

Data tersimpan di database

Sesuai Nilai input valid

8. Klik tombol navigasi edit

Menampilkan halaman edit user

sesuai 9. Isian field input edit

user belum lengkap, lalu klik ubah

Data belum diubah dan belum tersimpan ke database

Sesuai Nilai input invalid

10. Mengisi field input edit user, lalu klik ubah

Data diubah dan tersimpan di database

Sesuai Nilai input valid

11. Klik tombol navigasi hapus

Menampilkan alert dialog untuk konfirmasi ulang

Sesuai

12. Klik tombol hapus pada alert dialog

Data terhapus dari database

Sesuai 13. Klik tombol detail

user

Menampilkan pop-ups berisikan detail user

Sesuai 14. Klik bagian Masuk ke halaman data

bagian

Sesuai 15. Klik tombol navigasi

tambah

Masuk halaman input tambah bagian

Sesuai 16. Isian field input

tambah bagian belum lengkap, lalu klik simpan

Data belum tersimpan ke database

Sesuai Nilai input invalid

17. Mengisi field input tambah bagian, lalu klik simpan

Data tersimpan di database

Sesuai Nilai input valid

18. Klik tombol navigasi edit

Menampilkan halaman edit bagian

sesuai 19. Isian field input edit

Dokumen terkait