Otentikasi Menggunakan Session dalam PHP

(c) 2003 by BayuBayu. Berikut ini adalah artikel lama yang dipublikasikan untuk majalah Quad (majalah nya Teknik Elektro Universitas brawijaya) yang terbit pada 2003. Dipindahkan ke blog ini, sebelumnya ada di situs lama. Semoga bermanfaat.

Saat berinternet, kita tentu sering menjumpai situs yang mengharuskan pengunjung melakukan login terlebih dahulu agar dapat mengakses informasi mereka. Misalnya saja pada situs e-mail, disitu kita perlu mengisikan user name dan password sebelum mengakses email, kemudian melakukan logout setelah selesai.

Pada PHP terdapat fitur bernama session handling yang bisa dipakai untuk keperluan otentikasi seperti di atas.

Artikel ini mencoba membahas dasar-dasar session dan penerapannya dalam pembuatan aplikasi login.

Pada dasarnya session adalah cara untuk menjaga suatu variabel tetap ada selama sesi kunjungan user. Meskipun berpindah-pindah halaman, variabel session tetap ada dan bisa diakses sampai session ditutup. Fasilitas session handling ini baru ada secara built-in mulai PHP versi 4.

Pertukaran Variabel antar script

Bila suatu variabel didefinisikan secara global pada skrip PHP, maka variabel itu memiliki lingkup hanya sebatas dalam skrip PHP itu saja. Variabel itu tidak dapat diakses dari file PHP lain dengan cara biasa. Bila kita menginginkan variabel yang bisa diakses dari banyak file PHP, kita perlu variabel yang bersifat superglobal.

Untuk itu, variabel harus dipropagasi atau dikirim ke server terlebih dahulu. Ada beberapa cara untuk melakukannya. Pertama, variabel tersebut dikirim secara langsung melalui string yang ditambahkan ke URL, seperti halnya metode GET dalam pengiriman data melalui form html.
Contoh sederhananya pada URL berikut:

utama.php?halaman=1&userid=100

URL ini akan menuju ke file utama.php dan pada utama.php akan terdapat variabel $halaman yang bernilai 1 dan variabel $userid bernilai 100.

Cara lain yaitu menggunakan cookies. Cookies adalah mekanisme penyimpanan data atau variabel di sisi klien (browser). Dengan menyimpan variabel sebagai cookie, data tersebut akan tetap ada sampai waktu kadaluarsa yang bisa ditentukan. Cookie biasa dipakai di situs-situs untuk mengidentifikasi pengunjung yang mengakses situs mereka. Misalnya pada aplikasi polling, dimana satu pengunjung hanya bisa melakukan vote satu kali dalam sehari.

Session Handling di PHP

Prinsip kerja session ternyata sama dengan kedua cara di atas. Sebelum mengetahui cara kerjanya, ada baiknya kita berkenalan dengan beberapa fungsi session yang penting:

session_start()

Digunakan untuk memulai session atau melanjutkan session yang telah distart sebelumnya.
Dalam pemakaiannya, fungsi ini harus ditulis di bagian paling atas halaman sebelum ada kode html atau output apapun dari php, karena merupakan bagian dari HTTP header.

session_register() .

digunakan untuk meregister variabel session. Variabel yang diregister akan tetap eksis sampai session ditutup. Fungsi ini bertipe boolean, menghasilkan keluaran TRUE bila variabel berhasil diregister.
Setelah variabel diregister, maka nilainya akan tersedia dalam array asosiatif bernama $HTTP_SESSION_VARS[“nama_variabel”] atau pada PHP yang versinya lebih baru tersedia $_SESSION[‘nama_variabel’]. Variabel-variabel ini bersifat superglobal.

Contoh, misalkan kita akan meregister variabel bernama userid

session_register(“userid”);

Maka untuk mengisi userid dengan nilai 100.

$HTTP_SESSION_VARS["userid"] = 100;

Atau

$_SESSION[“userid”] = 100;

Bisa juga dengan cara yang lebih sederhana:

$userid = 100;

Cara yang terakhir bisa dilakukan bila option register_globals bernilai on (pada file konfigurasi php.ini). Dengan begitu userid tersedia sebagai variabel global $userid dan dapat diakses langsung. Pada PHP versi 4.2 ke atas, biasanya option ini dinonaktifkan dengan alasan keamanan.
Setiap skrip yang ingin memakai variabel session, harus memulai session dahulu dengan fungsi session_start() yang dipanggil di awal skrip sebagai header.

session_unregister()

Digunakan untuk mengunregister variabel dari suatu session.

session_destroy()

Menghancurkan semua variabel yang berhubungan dengan session.

Untuk fungsi-fungsi lainnya, dapat dilihat di referensi PHP.

Cara kerja Session:

Berikut ini adalah gambaran mengenai cara kerja session:
Saat pengunjung mengakses suatu halaman, pengunjung tersebut memulai session (digunakan fungsi session_start()). Bila dalam konfigurasi php, session.auto_start diset ke 1 maka php akan melakukan start session secara otomatis.

Pengunjung tadi kemudian diberi pengenal berupa session id, Session id ini adalah rangkaian karakter yang unik, misalnya 12345678xx.
Bersamaan dengan itu, pada sisi server juga dibuat file ses_12345678xx yang berisi variabel-variabel session milik si pengunjung. Variabel yang diregister dengan fungsi session_register() akan disimpan dalam file ini.

Metode di atas adalah default. Sebenarnya anda juga bisa menentukan lokasi penampungan variabel session anda sendiri, misalnya di database.
Selanjutnya, saat pengunjung memulai atau melanjutkan session (melalui session_start()) maka dia tinggal mengirim session id-nya untuk memperoleh kembali variabel-variabel session miliknya yang telah disimpan di server.

Pengiriman session id ke server bisa melalui 2 cara. Yang pertama, yaitu cara default, dikirim melalui cookies. Session id berupa cookie PHPSESSID (default).
Ada kalanya dengan alasan tertentu, si pengunjung menonaktifkan cookies (bisa dilakukan melalui setting browsernya). Bila hal ini terjadi, maka pengiriman session id dilakukan dengan cara kedua, yaitu melalui query string (string yang ditambahkan ke URL, seperti contoh di awal artikel).

Session akan berakhir saat fungsi session_destroy() dipanggil atau sewaktu user menutup web browsernya.

Dari cara kerja session tadi, terlihat bahwa yang menjadi kunci pegangan si pengunjung (di sisi client) hanyalah variabel session id, sedangkan variabel-variabel lain miliknya berada di sisi server.
Adanya fasilitas session handling di PHP menjadikan proses diatas menjadi sederhana dan mudah karena PHP melakukannya otomatis untuk anda.

Contoh aplikasi login sederhana.

Dengan menggunakan fungsi2 session, kita bisa membangun suatu mekanisme login.
Skenarionya begini: Pengunjung mengakses halaman utama index.php, disana dia disodori form user dan password untuk login. Ia harus memasukkan username dan password yang valid agar dapat mengakses informasi utama di situs ini. Kemudian setelah selesai, disediakan link untuk logout.

Untuk itu kita membutuhkan satu tabel database untuk menampung data user yang terdaftar. Dalam contoh ini dipilih MySQL karena telah umum dipakai serta gratis.
Pertama-tama kita siapkan dahulu sebuah database bernama session dan tabel bernama user dengan struktur berikut:

CREATE DATABASE session;
CREATE TABLE user
    (us_id int(10) AUTO_INCREMENT PRIMARY KEY,
     us_nama varchar(32),
     us_email varchar(50),
     us_angkatan varchar(4),
     us_url varchar(100),
     us_password varchar(32)
    )

Kemudian isilah tabel hingga setidaknya berisi satu user, misalnya.

INSERT INTO user (us_id,us_nama,us_email,us_angkatan,us_url,us_password)
VALUES (1,’bayu’,’bayuriz@operamail.com’,’2002’,’http://bayuriz.cjb.net’,’passwordku’);

Kemudian kita akan membuat 3 buah skrip berikut
index.php, berisi halaman pembuka yang menampilkan informasi, tetapi si pengunjung harus login dahulu untuk melihat informasi tersebut.
login.php, adalah skrip yang memproses login.
logout.php, script untuk log out.

index.php
1    <?php
2
   3    session_start();
4
5    echo "selamat datang";
6
7    if (!session_is_registered("status"))
8    {   session_register("userid");
9        $userid = "";
10       session_register("status");
11       $status =0;
12   }
13
14   if ($status != "1")
15   {?> <form method=post action=login.php>
16       Nama id: <input type=text name=namaid><br>
17       Password : <input type=password name=passwd><br>
18       <input type=submit>
19       </form>
20   <?}
21   else
22   { // get data user dari database
23     mysql_connect("localhost","root","") or die("koneksi ke mysql gagal");
24     mysql_select_db("session") or die("selek database gagal");
25
26     $get_datauser = mysql_query("SELECT * FROM user WHERE us_id=$userid") or die("");
27     if ($row = mysql_fetch_array($get_datauser) or die(""))
28     { $u_nama = $row[us_nama];
29       $u_email = $row[us_email];
30       $u_angkatan = $row[us_angkatan];
31       $u_url = $row[us_url];
32     }
33     // tampilkan konten disini
34     print "<p>Anda login sebagai $u_nama, angkatan $u_angkatan dengan email $u_email
35            <br><a href=logout.php>logout</a>";
36   }
37   ?>

Pada skrip ini variabel session yang dipakai adalah userid dan status. Bila belum login, maka nilai status=0, sedangkan bila sudah login, maka status=1. Saat pengunjung berhasil login, userid akan diberi nilai sama dengan user id yang disimpan di database. Jika tidak, maka userid kita biarkan kosong.Pertama-tama skrip memulai suatu session dengan dipanggilnya fungsi session_start(), selanjutnya pada baris 7 akan dicek apakah variabel userid dan status telah diregister. Jika belum, maka lakukan register.
Kemudian pada baris 14 dilakukan pengecekan status. Bila status=0, berarti user belum login, maka form login dicetak, sebaliknya jika status=1, informasi utama akan ditampilkan.

login.php
1    <?php
2    mysql_connect("localhost","root","") or die("koneksi ke mysql gagal");
3    mysql_select_db("session") or die("selek database gagal");
4
5    $namaid = addslashes($namaid);
6
7
8    $cheklogin = mysql_query("SELECT us_id FROM user WHERE (us_nama = '$namaid') AND (us_password = '$passwd')") or die(mysql_error());
9
10   if (!mysql_num_rows($cheklogin))
11   {  print "Anda tidak terdaftar, silakan register dulu";
12   }
13   else
14   {   session_start();
15
16       // set user id
17       if ($row = mysql_fetch_array($cheklogin) or die(""))
18       { $userid = $row[us_id];
19       }
20
21       $status = "1";  // set status login = 1
22       header("location:index.php"); // ke halaman index
23   }
24   ?>

Pada baris 8 dilakukan pengecekan username dan password dalam database. Jika cocok, maka nilai status=1, sedangkan userid=user id yang sesuai dalam database. Perhatikan bahwa session_start(); juga dipanggil di awal, hal ini supaya skrip ini bisa mengenali $userid dan $status sebagai variabel session.
Selanjutnya, pengunjung dikembalikan ke halaman index.php untuk disuguhi informasi.

logout.php
1    <?php
2    session_start();
3    {
4      $userid = "";
5      $status = "0";
6      print "berhasil logout
7             <br><a href=index.php>kembali ke halaman utama</a>";
8    }
9    ?>

Dalam proses logout, pada baris 3, variabel userid dan status akan dikosongkan, sehingga pengunjung kembali dalam keadaan belum login.

Aplikasi kecil ini hanya berfokus ke proses otentikasinya. Anda perlu mengembangkannya lebih lanjut seperti menambahkan skrip manajemen user, pendaftaran user baru dan sebagainya.
Selain itu untuk siap digunakan di dunia maya, banyak hal yang perlu ditambahkan dalam hal sekuriti. Soalnya selalu ada pengunjung usil di luar sana.

Selamat mencoba


Bookmark and Share Tell a Friend

11 Comments »

  • Sani   |   January 11th, 2009 at 4:33 pm

    Mbok…
    opo iki…?
    koyok blog e geo ae…

    isine keilmuwan dan aq gak ngerti :D

  • irhdhy   |   March 23rd, 2009 at 5:22 pm

    $namaid = addslashes($namaid);

    addslashes($namaid) untuk apa ayo ?

    wah ternyata pemograman php itu sulit dan harus paham betul bahasa dan algoritmanya…

    pasti seorang programmer rambutnya botak . . . hehehe . . .

    turz pusing ga jara menguload databese nya . . .

    thx

  • Edi Johan Syah Djula   |   March 27th, 2009 at 3:47 pm

    Saya tertarik sekali dengan tutorial ini.
    Saya punya suatu masalah sebelumnya. Misalnya terdapat 3 pengguna.
    yang pertama ketika masuk akan di alihkan ke halaman “free.php” dengan “stat = 1″
    yang kedua ketika masuk akan dialihkan ke halamn “member.php” dengan “stat = 2″
    yang ketiga ketika masuk akan dialihkan ke halaman “admin.php” dengan “stat = 3″
    dan orang yang tidak memiliki account yang terdaftar akan kembali ke “login.php”

  • arZ_4   |   July 5th, 2009 at 11:18 am

    It kan cr2 nya.Knpa tidak ditampilkan juga hasil dr pmbuatan login dan tabel database untuk menampung data user yang terdaftar..Mulai dr pmbuatan tabel smpai dgn logout???

  • koernia   |   February 18th, 2010 at 3:43 pm

    good pembahasan otentikasinya, tapi bagaimana dengan script untuk pemisahan hak akses bagi user umum dan Administrator??

  • rio   |   July 24th, 2010 at 10:02 pm

    bagus banget penjelasannya sangat detail mirip dibuku, mantap bro !!!

  • Yusuf   |   November 2nd, 2010 at 1:21 pm

    Warning: session_start() [function.session-start]: open(/srv/www/clients/client100/web95/tmp/sess_07b041153f317505e2b494f6d39cf6e6, O_RDWR) failed: No such file or directory (2) in /srv/www/clients/client100/web95/web/index.php on line 6

    Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at /srv/www/clients/client100/web95/web/index.php:6) in /srv/www/clients/client100/web95/web/index.php on line 6

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /srv/www/clients/client100/web95/web/index.php:6) in /srv/www/clients/client100/web95/web/index.php on line 6

    Kenapa ini mas??mohon bantuannya

  • ricky   |   November 14th, 2010 at 8:03 pm

    malam gan , minta pencerahan dong session saya udah bener tapi klo dimasukin coding utk membatasi hakakses keluar error “redirect”
    knp yah??

  • yadi permana putra   |   November 19th, 2010 at 6:33 pm

    thanks infonya :)

  • dika   |   December 1st, 2010 at 12:27 am

    mas saya mohon petunjuknya untuk pertanyaan dari koernia | February 18th, 2010 at 3:43 pm

    good pembahasan otentikasinya, tapi bagaimana dengan script untuk pemisahan hak akses bagi user umum dan Administrator??

  • Jual Sepatu Murah   |   November 20th, 2017 at 9:17 am

    Mantab gan , bagus artikelnya..

    Kunjungi blog kami juga ya gan http://fasmocis.com

RSS feed for comments on this post. TrackBack URL

Leave a comment