Less talk, more code

The blog of Iskandar Soesman

Mencegah Kembali Login Setelah Loguot dengan Menekan Tombol Back pada Browser

Suatu saat saya sedang membuat sebuah aplikasi. Salah satu featurenya adalah otentifikasi yang menggunakan email dan password bagi user yang akan login. Setelah menyelesaikan bagian otentifikasi ini kemudian saya mencobanya.

Catatan: Ini adalah arsip dari blog lama yang dibuat pada tanggal 2009-04-20 09:52:50 yang isinya mungkin saja sudah tidak relevan lagi.

Semuanya tampak berjalan sesuai seperti yang saya harapkan. Halaman-halaman yang sudah ditetapkan hanya bisa dibuka ketika user sudah login sudah dapat terlindungi dengan baik. Hal ini berarti user tidak bisa mengakses secara langsung halaman ini sebelum ia login. Namun secara kebetulan saya menemukan hal yang cukup mengganjal. Ketika saya sudah logout dan mengklik tombol back pada browser saya, halaman yang seharusnya hanya bisa dibuka ketika user dalam kondisi login ternyata masih bisa ditampilkan oleh browser. Kenapa hal ini bisa terjadi? Padahal saya sudah menetapkan algoritma "jika session atau cookie user sudah terhapus maka halaman tersebut tidak dapat diakses".

Untungnya ini hanya cache dari halaman yang saya kunjungi, yang kebetulan halaman yang seharusnya dilindungi oleh otentifikasi. Meskipun halaman tersebut muncul saya tetap tidak dapat berbuat apa-apa (mengganti password misalnya) karena untuk proses selanjutnya tetap dilakukan pengecekan session user. Namun hal ini tetap membuat saya tidak nyaman. Saya membayangkan jika user yang menggunakan aplikasi yang saya buat menekan tombol back pada browsernya setelah ia logout, sama seperti yang saya lakukan. Hal ini pasti akan membuat user tersebut tidak nyaman. Atau mungkin tidak akan kembali ke website tersebut karena merasa tidak aman.

Saya mencoba melakukan pengamatan pada beberapa website besar seperti Google, Yahoo, Facebook dan Friendster. Hal menarik yang saya temukan adalah selain Friendster, semua website tersebut langsung mengarahkan kehalaman login setelah saya menekan tombol back. Setelah melakukan pencarian saya menemukan bahwa browser membaca cache pada halaman yang sebelumnya saya buka walaupun halaman tersebut telah dilindungi oleh session.

Untuk mengatasi ini yang perlu dilakukan adalah memberikan informasi kepada browser agar tidak men-cache halaman yang ingin kita lindungi. Untuk itu dalam setiap halaman yang ingin kita lindungi bisa kita tambahkan kode berikut:

<?php

header('Expires: Mon, 1 Jul 1998 01:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
header( "Last-Modified: " . gmdate( "D, j M Y H:i:s" ) . " GMT" );

Kode ini mengirimkan informasi kepada browser agar tidak menyimpan cache pada halaman yang kita lindungi. Sehingga ketika kita menekan tombol back setelah logut browser akan meminta lagi ke server dan bukan membaca cache di lokal. Perlu diperhatikan, agar meletakan kode ini sebelum ada output apapun (echo, print dll).

Semoga trik ini bisa membantu para developer sekalian, karena saya menemukan cukup banyak juga website-website yang seperti ini.