Sabtu, 20 Agustus 2011

CODE IGNITER SESSION DAN SECURITY


Session Codeigniter

Secara umum session digunakan untuk menyimpan suatu informasi antar proses permintaan.
Session bekerja dengan variabel sesi PHP yang digunakan untuk menyimpan informasi sesi, atau mengubah pengaturan untuk sesi pengguna. Variabel sesi menyimpan informasi tentang salah satu penguna, dan tersedia untuk semua halaman dalam satu aplikasi.
Melalui session yang tersimpan pemilik web atau administrator memungkinkan proses pelacakan aktivitas pengguna yang sedang beroperasi pada web maupun yang telah mengunjungi melalui sebuah sessi yang dibagi dan disimpan dalam cookie, selain itu session juga bisa disimpan dalam sebuah database.
Salah satu contoh penggunaan session yang umum adalah pada proses login suatu halaman web, yaitu pengguna memasukan data username dan password melalui form login, setelah login berhasil maka pengguna dihadapkan pada halaman navigasi yang menuju pada data isi halaman yang dimaksud atau link halaman lainya, pencatatan kegiatan username dan passwordnya untuk tetap bisa berada dalam halaman yang dimaksud dikerjakan oleh session.
Dalam Framework CodeIgniter yang mengaplikasikan model MVC (Model, View, Controller) Model bertugas memanggil dan memanipulasi data pada database, view bertugas menampilkan data pada user, Controller bertugas sebagai eksekutor yang memproses seluruh programming web. untuk membentuk suatu session dibutuhkan adalah terlebih dahulu membentuk controller dengan mengaplikasikan standar kode CI sebagai berikut

$this->load->library('session');

Ketika halaman dibuka, session class akan memeriksa untuk melihat apakah data session yang valid ada dalam session cookie pengguna. Jika session data tidak ada (atau jika itu telah berakhir) sesi baru akan dibuat dan disimpan dalam cookie. Jika tidak ada session, informasi yang akan diperbarui dan cookie akan diperbarui. Dengan setiap update, session_id akan dibuat ulang.

Session bisa terbentuk dari sebuah array yang berisi informasi berikut :

[array]
 (
      'session_id'    => karaker acak,
      'ip_address'    => 'string – pengguna alamat IP',
      'user_agent'    => 'string – data perambah',
      'last_activity' => durasi / waktu / aktifitas terakhir
 )

1. Session id adalah karakter unik yang terbentuk dari string acak sehingga membentuk ID unik dengan menggunakan algoritma Md5 dengan enkripsi yang kuat dan digeneralisasi setiap lima menit.
2. alamat IP pengguna
3. 50 karakter penggunaan perambah
4. durasi waktu terakhir

Session terenkripsi jika diaktifkan, serial array akan dilakukan enkripsi terlebih dahulu sebelum  disimpan dalam cookie, hal ini membuat data yang sangat aman dan tahan terhadap pembacaan atau atau pengubahan oleh seseorang. Session ini di baca ulang setiap lima menit jika terjadi halaman yang di baca berulang – ulang hanya session aktifitas terkahir yang ditulis, akan tetapi dapat dilakukan pengubahan dengan mangganti baris kode pada system/config/config.php

$config['sess_time_to_update'

Pengambilan data session dari array menggunakan fungsi berikut :

$this->session->userdata('item');

Sebagai contoh pengambilan session id

$session_id = $this->session->userdata('session_id');

Fungsi mengembalikan FALSE (boolean) jika item yang Anda coba akses tidak ada.
Penambahan Custom Session Data merupakan sebuah aspek yang berguna dari array session, dengan fasilitas ini dapat menambahkan data sesuai dengan pengaturan tersendiri yang dapat disimpan dalam cookie pengguna. Sebagai contoh seorang pengguna login ke halaman web setelah dikonfirmasi maka dapat ditambahkan username dan alamat email untuk session cookie, dapat  membuat data global yang tersedia tanpa harus menjalankan query database ketika membutuhkannya.
Untuk mendapatkan data ke session array maka data array harus ditampilkan dengan fungsi berikut :

$this->session->set_userdata($array);

Dimana $ array adalah array asosiatif yang berisi data baru. Berikut contohnya:

$newdata = array(
                    'username'  => 'admin',
                    'email'     => 'admin@itbbatch4.com',
                    'logged_in' => TRUE
                );

 $this->session->set_userdata($newdata);

Jika Anda ingin menambahkan userdata satu nilai pada suatu waktu, set_userdata () juga mendukung sintaks ini.

$this->session->set_userdata('some_name', 'some_value');

Cookie hanya bisa menampung 4KB data, maka berhati-hatilah untuk tidak melebihi kapasitas. Proses enkripsi khususnya menghasilkan string data baru dari aslinya sehingga harus memperhatikan jumlah data yang tersimpan.

Hal penting lainya dalam session ini adalah menghapus session data, sama seperti set_userdata () dapat digunakan untuk menambahkan informasi ke dalam sesi, unset_userdata () dapat digunakan untuk menghapusnya, dengan melewatkan kunci sesi. Misalnya, jika Anda ingin menghapus 'some_name' dari informasi sesi Anda: 

$this->session->unset_userdata('some_name');

Fungsi ini juga dapat digunakan untuk menghapus data pada array asosiatif.

$array_items = array('username' => '', 'email' => '');

 $this->session->unset_userdata($array_items);

CodeIgniter mendukung "flashdata", atau session data yang hanya akan tersedia untuk permintaan server berikutnya, dan kemudian secara otomatis dihapus. Kegunaan flash data biasanya untuk pesan informasi atau status (misalnya: "catatan 2 dihapus").Variabel Flash diawali dengan "flash_" sehingga menghindari penamaan yang sama dengan nama session yang dimiliki.

$this->session->set_flashdata('item', 'value');

setting bisa dilakukan dengan sebuah array set_flashdata(), dengan cara yang sama  seperti set_userdata().

Untuk mebaca variable flash data:

$this->session->flashdata('item');

Jika memerlukan untuk mempertahankan variabel flashdata melalui permintaan tambahan, dapat dilakukan dengan menggunakan fungsi keep_flashdata ().

$this->session->keep_flashdata('item');

ketika session data array disimpan, cookie pengguna akan terisi sebuah session ID,  kecuali jika menyimpan session data  dalam database maka tidak ada cara untuk memvalidasi itu. Untuk beberapa aplikasi memerlukan sedikit bahkan tanpa keamanan, validasi sangat diharuskan.  Jika tidak maka session yang lebih lama bisa dikembalikan dengan merestorasi menggunakan memodifikasi cookies pengguna.

Ketika session data tersedia dalam database, setiap kali sesi yang valid ditemukan dalam cookie pengguna, query database dilakukan untuk mencocokannya. Jika session ID tidak cocok, session ini hancur. Session ID tidak dapat diperbarui, hanya dapat dihasilkan ketika session baru dibuat.

Untuk menyimpan session , maka yang pertama dilakukan adalah membuat tabel data base tujuan, salah satu contoh dari gambaran penggunaan script menggunakan MySQL.

CREATE TABLE IF NOT EXISTS  `ci_sessions` (

session_id varchar(40) DEFAULT '0' NOT NULL,

ip_address varchar(16) DEFAULT '0' NOT NULL,

user_agent varchar(50) NOT NULL,

last_activity int(10) unsigned DEFAULT 0 NOT NULL,

user_data text DEFAULT '' NOT NULL,

PRIMARY KEY (session_id)

);

Secara default tabel disebut ci_sessions, tapi dapat diganti dengan nama apa pun yang diinginkan dengan memperbaharui pada berkas aplication/config/config.php sehingga berisi nama yang telah dipilih. Setelah dibuat tabel database, dapat diaktifkan pilihan database di file config.php sebagai berikut:

$config['sess_use_database'] = TRUE;

Setelah daiktifkan , session class akan disimpan dalam session data pada DB, pastikan spesifikasi nama tabel pada konfigurasi sesuai.

$config['sess_table_name'] = 'ci_sessions';

session class memiliki koleksi sampah yang mana akan dibersihkan ketika keluar dengan session yang kadaluarsa sehingga tidak perlu rutinitas untuk membersihkannya. Untuk membersihkan session

$this->session->sess_destroy();

Fungsi ini merupakan fungsi terakhir jika terdapat pengecualian hanya beberapa pilihan yang hancur makan harus digunakan unset_userdata ()

 application/config/config.php
Preferensi
Default
Pilihan
Deskripsi
sess_cookie_name
ci_session
None
Nama session
sess_expiration
7200
None
Setting sesi maksimum adalah 2 jam (7200) detik jika session diinginkan tidak berakhir maka nilai diset menjadi 0
sess_expire_on_close
FALSE
TRUE/FALSE (boolean)
Pilihan berakhirnya session ketika browser di tutup
sess_encrypt_cookie
FALSE
TRUE/FALSE (boolean)
Pilihan berahirnya session utuk mengenkripsi
sess_use_database
FALSE
TRUE/FALSE (boolean)
untuk menyimpan data sesi ke database. Anda harus membuat tabel sebelum nya mengaktifkan opsi ini.

sess_table_name
ci_sessions
Semua nama yang bisa divalidasi
Nama tabel untuk database session
sess_time_to_update
300
Satuan waktu
Satuan waktu untuk menggerasi sendiri session
sess_match_ip
FALSE
TRUE/FALSE (boolean)
Pencocokan alamat IP ketika membaca session data. Beberapa penggunaa ip yang dinamis mengharuskan setting  diarahkan ke FALSE 
sess_match_useragent
TRUE
TRUE/FALSE (boolean)
Mecocokan penggunaan browser


Berikut adalah contoh kasus dalam penggunaan session, untuk mengakses halaman sebuah web maka diperlukan inisialisasi dengan melakukan login terlebih dahulu dengan sebuah username dan password yang disediakan.


Langkah kerja yang dibuat seagai berikut :

1. Buat database dengan phpmyadmin (http://localhost/phpmyadmin) atau dengan CLI
    isi  sebagai berikut :
-- Table structure for table `pengguna`
--
CREATE TABLE IF NOT EXISTS `pengguna` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(100) NOT NULL,
`type` varchar(45) NOT NULL,
`status` tinyint(4) NOT NULL,
`registered` datetime DEFAULT NULL,
`last_login` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
--
--Dumping data for table `users`
--
INSERT INTO`users` (`id`, `username`, `password`, `email`, `type`, `status`,`registered`, `last_login`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 'admin@itbbatch4.com', 'admin', 1, '0000-00-00 00:00:00', NULL);

2. Buka application > config > database.php dan cari serta ubah kode PHP menjadi seperti ini:

$db['default']['hostname']='localhost';  
$db['default']['username']='root';
$db['default']['password']='';
$db['default']['database']='d4itbb4';    
$db['default']['dbdriver']='mysql';

hostname adalah localhost karena server ditempatkan di server lokal
username adalah root kerena itu adalah user utama pada system
password adalah kosong
database adalah webpraktek karena namanya dibuat seperti itu
dbdriver adalah enggine databasenya yaitu mysql
3. Buka application > config > autoload.php dan cari serta ubah kode PHP menjadi seperti ini:

$autoload['libraries'] = array('database', 'session', 'form_validation');  
$autoload['helper']= array('url','form');

4. Buka application > config > config.php dan cari serta ubah kode PHP menjadi seperti ini:
$config['base_url']    = 'http://localhost/d4itbb4/';  
$config['encryption_key']='batch@s34m0l3c';

5. Simpan Model pada application > models > admin_model.php.
<?php  
class Admin_model extends CI_Model
{
var $tabel_name = 'users';
function __construct()
{
parent::__construct();
}
function cek_user_login($username, $password)
{
$this--->db->select('*');
$this->db->where('username',$username);
$this->db->where('password',md5($password));
$query = $this->db->get($this->tabel_name, 1);
if ($query->num_rows() == 1)
{
return $query->row_array();
            }
      }
}
?>

6. Simpan Controller pada application > controllers > admin.php
<?php  
class Admin extends CI_Controller
{
function__construct()
{
parent::__construct();
$this--->load->model('Admin_model');
}
function index()
{
redirect('admin/dashboard');
}
function login()
{
$this->form_validation->set_rules('username', 'username', 'required|xss_clean');
$this->form_validation->set_rules('password', 'password', 'required|xss_clean');
$this->form_validation->set_error_delimiters('', '<br>');
if ($this->form_validation->run() == TRUE)
{
$username = $this->input->post('username');
$password = $this->input->post('password');
$login_data = $this->Admin_model->cek_user_login($username, $password);
if ($login_data == TRUE)
{
$session_data = array
(
'user_id' => $login_data['id'],
'username' => $login_data['username'],
'type' => $login_data['type'],
'is_login' => TRUE
);
$this->session->set_userdata($session_data);
redirect('admin/dashboard');
}
else
{
redirect('admin/login');
}
}
$this->load->view('login');
}
function dashboard() {
$this->check_logged_in();
$this->load->view('dashboard');
}
function logout()
{
$data = array
(
'user_id' => 0,
'username' => 0,
'type' => 0,
'is_login' => FALSE
);
$this->session->sess_destroy();
$this->session->unset_userdata($data);
redirect('admin/login');
}
public function check_logged_in()
{
if ($this->session->userdata('is_login') != TRUE)
{
redirect('admin/login', 'refresh');
exit();
}
}
public function is_logged_in()
{
if ($this->session->userdata('logged_in') == TRUE)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
?>

7. application > views > login.php

<h2>Login Administrator</h2>
<hr>
<?php echo validation_errors();?>
<?php echo form_open('admin/login')?>
<br>
Username :<?php echo form_input('username')?><br>
Password :<?php echo form_password('password');?><br>
<?php echo form_submit('submit', 'Login') ?>
<?php echo form_close(); ?>

8. application > views > dashboard.php
<h2>Dashboard User</h2>
<br>
LOGIN SUKSES!
<br>
<h3><strong><?php echo anchor('admin/logout', 'Logout') ?></strong></h3>




Referensi :

2 komentar:

  1. This article is good . For more detail in briefly click here

    HOW TO CREATE A SESSION IN PHP

    BalasHapus
  2. Casino Bonus Codes 2021 - JT Hub
    Read 문경 출장안마 our Casino Bonus 군산 출장샵 Codes 2021 for $55 FREE 충청북도 출장안마 + $1000 광양 출장샵 Casino Rewards members get $55 in 여수 출장샵 free credits on their first 10 deposits.

    BalasHapus