Sistem login adalah jantung keamanan aplikasi web. Tanpa pengelolaan session yang baik, akun pengguna bisa diretas melalui session hijacking atau session fixation. Pada artikel ini, kita akan membahas keamanan session, paling tidak ada tiga fitur keamanan penting dalam manajemen session di PHP:
-
Session Timeout (batas waktu login)
-
Logout Otomatis
-
Regenerasi Session ID (Session Hijacking Prevention)
Memahami Session dan Keamanannya
Session di PHP digunakan untuk menyimpan data pengguna saat login agar tetap dikenali selama menggunakan website.
Namun, jika tidak dijaga dengan benar, session bisa menjadi pintu masuk bagi hacker untuk mengambil alih akun pengguna.
Contoh sederhana session:
<?php session_start(); $_SESSION['username'] = 'arvi'; echo "Selamat datang, " . $_SESSION['username']; ?>
Masalahnya, session ini bisa diretas melalui pencurian cookie atau reuse session ID. Karena itu, kita perlu langkah-langkah pengamanan tambahan.
Menambahkan Timeout Session (Batas Waktu Login)
Timeout session memastikan pengguna otomatis logout setelah waktu tertentu tanpa aktivitas — misalnya, 15 menit.
Berikut contoh penerapannya:
<?php
session_start();
// waktu maksimum dalam detik (15 menit)
$timeout = 15 * 60;
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $timeout)) {
session_unset(); // hapus semua variabel session
session_destroy(); // hancurkan session
header("Location: login.php?timeout=1");
exit();
}
$_SESSION['LAST_ACTIVITY'] = time(); // update waktu aktivitas terakhir
?>
Dengan kode ini, jika pengguna diam selama lebih dari 15 menit, mereka akan otomatis logout dan diminta login ulang.
Logout Otomatis Berdasarkan Aktivitas
Logout otomatis bisa digabung dengan timeout, tetapi juga bisa berdasarkan aktivitas spesifik seperti logout manual atau setelah selesai transaksi.
<?php
// logout.php
session_start();
session_unset();
session_destroy();
header("Location: login.php?logout=success");
exit();
?>
Untuk pengalaman lebih baik, tambahkan alert menggunakan Bootstrap atau SweetAlert agar pengguna tahu kenapa mereka logout otomatis.
Contoh (menggunakan Bootstrap alert di login.php):
<?php if (isset($_GET['timeout'])): ?> <div class="alert alert-warning">Sesi Anda telah berakhir. Silakan login kembali.</div> <?php endif; ?>
Regenerasi Session ID untuk Mencegah Session Hijacking
Session hijacking terjadi saat hacker mencuri ID session pengguna.
Untuk mencegahnya, PHP menyediakan fungsi session_regenerate_id() yang membuat session ID baru tanpa kehilangan data lama.
Contoh:
<?php
session_start();
// Setelah login berhasil
if (!isset($_SESSION['regenerated'])) {
session_regenerate_id(true); // buat session ID baru
$_SESSION['regenerated'] = true;
}
?>
Atau, Anda bisa memanggil fungsi ini secara berkala untuk meningkatkan keamanan:
<?php
if (time() - $_SESSION['LAST_ACTIVITY'] > 300) { // setiap 5 menit
session_regenerate_id(true);
}
?>
Fungsi ini memutus hubungan antara ID session lama dengan yang baru, sehingga meskipun ID lama dicuri, tidak bisa digunakan lagi.
Tips Tambahan untuk Meningkatkan Keamanan Session
Selain tiga poin di atas, berikut beberapa praktik terbaik:
✅ Gunakan session.cookie_httponly = 1
→ Mencegah akses cookie lewat JavaScript (anti XSS).
✅ Aktifkan session.use_only_cookies = 1
→ Hindari session ID dikirim lewat URL.
✅ Gunakan HTTPS
→ Mencegah pencurian data melalui jaringan.
✅ Enkripsi password dengan password_hash()
→ Jangan pernah simpan password mentah di database.
Contoh Lengkap Login Aman dengan Timeout dan Regenerasi
Berikut contoh sederhana penerapannya:
<?php
session_start();
include 'config.php'; // koneksi database
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$user = $_POST['username'];
$pass = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param("s", $user);
$stmt->execute();
$result = $stmt->get_result();
$data = $result->fetch_assoc();
if ($data && password_verify($pass, $data['password'])) {
session_regenerate_id(true);
$_SESSION['username'] = $user;
$_SESSION['LAST_ACTIVITY'] = time();
header("Location: dashboard.php");
exit();
} else {
$error = "Username atau password salah!";
}
}
?>
Pada file dashboard.php:
<?php
session_start();
$timeout = 900; // 15 menit
if (!isset($_SESSION['username'])) {
header("Location: login.php");
exit();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > $timeout) {
session_unset();
session_destroy();
header("Location: login.php?timeout=1");
exit();
}
$_SESSION['LAST_ACTIVITY'] = time();
echo "Selamat datang, " . $_SESSION['username'];
?>
Kesimpulan
Keamanan session adalah aspek penting dalam aplikasi PHP modern. Dengan menerapkan:
-
Timeout session
-
Logout otomatis
-
Session ID regeneration
Anda dapat melindungi pengguna dari berbagai serangan seperti session hijacking dan fixation. Langkah-langkah sederhana ini bisa meningkatkan keamanan sistem login Anda secara signifikan.